parsav  Diff

Differences From Artifact [ecfc7ba460]:

To Artifact [30c7a0b6c6]:


     1      1   -- vim: ft=terra
            2  +local pstr = lib.mem.ptr(int8)
            3  +local terra cs(s: rawstring)
            4  +	return pstr { ptr = s, ct = lib.str.sz(s) }
            5  +end
            6  +
     2      7   local terra 
     3      8   render_profile(co: &lib.srv.convo, actor: &lib.store.actor)
     4      9   	var aux: lib.str.acc
     5         -	var auxp: rawstring
           10  +	var auxp: pstr
     6     11   	if co.aid ~= 0 and co.who.id == actor.id then
     7         -		auxp = '<a href="/conf/profile">alter</a>'
           12  +		auxp = lib.str.plit '<a href="/conf/profile">alter</a>'
     8     13   	elseif co.aid ~= 0 then
     9     14   		aux:compose('<a href="/', actor.xid, '/follow">follow</a><a href="/',
    10     15   			actor.xid, '/chat">chat</a>')
    11     16   		if co.who.rights.powers:affect_users() then
    12     17   			aux:push('<a href="/',11):push(actor.xid,0):push('/ctl">control</a>',17)
    13     18   		end
    14         -		auxp = aux.buf
           19  +		auxp = aux:finalize()
    15     20   	else
    16     21   		aux:compose('<a href="/', actor.xid, '/follow">remote follow</a>')
    17     22   	end
    18     23   	var avistr: lib.str.acc if actor.origin == 0 then
    19     24   		avistr:compose('/avi/',actor.handle)
    20     25   	end
    21     26   	var timestr: int8[26] lib.osclock.ctime_r(&actor.knownsince, &timestr[0])
    22     27   
    23     28   	var strfbuf: int8[28*4]
    24     29   	var stats = co.srv:actor_stats(actor.id)
    25         -		var sn_posts = lib.math.decstr_friendly(stats.posts, &strfbuf[ [strfbuf.type.N - 1] ])
    26         -		var sn_follows = lib.math.decstr_friendly(stats.follows, sn_posts - 1)
    27         -		var sn_followers = lib.math.decstr_friendly(stats.followers, sn_follows - 1)
    28         -		var sn_mutuals = lib.math.decstr_friendly(stats.mutuals, sn_followers - 1)
           30  +		var sn_posts     = cs(lib.math.decstr_friendly(stats.posts, &strfbuf[ [strfbuf.type.N - 1] ]))
           31  +		var sn_follows   = cs(lib.math.decstr_friendly(stats.follows, sn_posts.ptr - 1))
           32  +		var sn_followers = cs(lib.math.decstr_friendly(stats.followers, sn_follows.ptr - 1))
           33  +		var sn_mutuals   = cs(lib.math.decstr_friendly(stats.mutuals, sn_followers.ptr - 1))
    29     34   	
    30     35   	var profile = data.view.profile {
    31         -		nym = lib.coalesce(actor.nym, actor.handle);
    32         -		bio = lib.coalesce(actor.bio, "<em>tall, dark, and mysterious</em>");
    33         -		xid = actor.xid;
    34         -		avatar = lib.trn(actor.origin == 0, avistr.buf,
    35         -			lib.coalesce(actor.avatar, '/s/default-avatar.webp'));
           36  +		nym = cs(lib.coalesce(actor.nym, actor.handle));
           37  +		bio = cs(lib.coalesce(actor.bio, "<em>tall, dark, and mysterious</em>"));
           38  +		xid = cs(actor.xid);
           39  +		avatar = lib.trn(actor.origin == 0, pstr{ptr=avistr.buf,ct=avistr.sz},
           40  +			cs(lib.coalesce(actor.avatar, '/s/default-avatar.webp')));
    36     41   
    37     42   		nposts = sn_posts, nfollows = sn_follows;
    38     43   		nfollowers = sn_followers, nmutuals = sn_mutuals;
    39         -		tweetday = timestr;
    40         -		timephrase = lib.trn(actor.origin == 0, 'joined', 'known since');
           44  +		tweetday = cs(timestr);
           45  +		timephrase = lib.trn(actor.origin == 0, lib.str.plit'joined', lib.str.plit'known since');
    41     46   
    42     47   		auxbtn = auxp;
    43     48   	}
    44     49   
    45     50   	var ret = profile:tostr()
    46     51   	if actor.origin == 0 then avistr:free() end
    47         -	if not (co.aid ~= 0 and co.who.id == actor.id) then aux:free() end
           52  +	if not (co.aid ~= 0 and co.who.id == actor.id) then auxp:free() end
    48     53   	return ret
    49     54   end
    50     55   
    51     56   return render_profile