Index: render/profile.t
==================================================================
--- render/profile.t
+++ render/profile.t
@@ -97,10 +97,11 @@
var aux = co:stra(128)
var followed = false -- FIXME
if co.aid ~= 0 and co.who.id == actor.id then
aux:lpush('alter')
elseif co.aid ~= 0 then
+ aux:lpush('options')
if co.who.rights.powers:affect_users() and co.who:overpowers(actor) then
aux:lpush(' control')
end
else
aux:lpush(' remote follow')
Index: render/timeline.t
==================================================================
--- render/timeline.t
+++ render/timeline.t
@@ -54,14 +54,17 @@
end
acc:lpush('')
acc:lpush('
')
var newest: lib.store.timepoint = 0
for i = 0, posts.sz do
+ var author = co:uid2actor(posts(i).ptr.author)
if mode == modes.mutual and posts(i).ptr.author ~= co.who.id then
- var author = co:uid2actor(posts(i).ptr.author)
if not author.relationship.recip.follow() then goto skip end
end
+ if author.relationship.rel.mute() or
+ author.relationship.rel.avoid() or
+ author.relationship.recip.exclude() then goto skip end
lib.render.tweet(co, posts(i).ptr, &acc)
var t = lib.math.biggest(lib.math.biggest(posts(i).ptr.posted, posts(i).ptr.discovered),posts(i).ptr.edited)
if t > newest then newest = t end
::skip:: posts(i):free()
end
Index: render/tweet.t
==================================================================
--- render/tweet.t
+++ render/tweet.t
@@ -15,11 +15,11 @@
acc:lpush('
✖')
end
end
local terra
-render_tweet(co: &lib.srv.convo, p: &lib.store.post, acc: &lib.str.acc)
+render_tweet(co: &lib.srv.convo, p: &lib.store.post, acc: &lib.str.acc): pstr
var author: &lib.store.actor = nil
var retweeter: &lib.store.actor = nil
for j = 0, co.actorcache.top do
if p.author == co.actorcache(j).ptr.id then author = co.actorcache(j).ptr end
if p.rtdby == co.actorcache(j).ptr.id then retweeter = co.actorcache(j).ptr end
@@ -33,14 +33,20 @@
if p.rtdby ~= 0 and retweeter == nil then
retweeter = co.actorcache:insert(co:uid2actor_live(p.rtdby)).ptr
end
::foundauth::
+ if author.relationship.rel.mute() or
+ author.relationship.recip.exclude() then return '' end
+
var timestr: int8[26] lib.osclock.ctime_r(&p.posted, ×tr[0])
for i=0,26 do if timestr[i] == @'\n' then timestr[i] = 0 break end end -- 🙄
-
- var bhtml = lib.smackdown.html(&co.srv.pool, [lib.mem.ptr(int8)] {ptr=p.body,ct=0},false)
+ var ptxt = pstr {ptr=p.body,ct=lib.str.sz(p.body)}
+ if author.relationship.rel.disemvowel() then
+ ptxt = lib.str.disemvowel(&co.srv.pool, ptxt)
+ end
+ var bhtml = lib.smackdown.html(&co.srv.pool, ptxt,false)
--defer bhtml:free()
var idbuf: int8[lib.math.shorthand.maxlen]
var idlen = lib.math.shorthand.gen(p.id, idbuf)
var permalink: lib.str.acc permalink:pool(&co.srv.pool, 7+idlen):lpush('/post/'):push(idbuf,idlen)
Index: store.t
==================================================================
--- store.t
+++ store.t
@@ -1,12 +1,8 @@
-- vim: ft=terra
local m = {
timepoint = lib.osclock.time_t;
- scope = lib.enum {
- 'public', 'private', 'local';
- 'personal', 'direct', 'circle';
- };
noticetype = lib.enum {
-- only add new values to the end of this list! the numerical value
-- is stored in the database and must be kept synchronized across versions
'none', 'mention', 'reply', 'like', 'rt', 'react', 'follow', 'followreq'
};
Index: str.t
==================================================================
--- str.t
+++ str.t
@@ -477,7 +477,85 @@
end
if mode ~= 0 then return m.t.null(), 0, false end
return b:finalize(), max, spacebroke
end
+
+local terra disemvowel_codepoint(start: pstr): {pstr, pstr}
+ -- TODO rewrite this in a more generative way -- it should be possible
+ -- to have a long string listing vowels and generate all the necessary
+ -- code based on that
+ var dslen: intptr = 0
+ var repl = pstr.null()
+
+ var adc = m.cdowncase(start(0))
+ if adc == @'a' or adc == @'e'
+ or adc == @'i' or adc == @'o'
+ or adc == @'u' then
+ dslen = 1 goto done
+ end
+
+ if start.ct >= 2 then
+ var tb = pstr { start.ptr, 2 }
+ if tb:cmp('ä') or tb:cmp('ë') or tb:cmp('ï')
+ or tb:cmp('Ä') or tb:cmp('Ë') or tb:cmp('Ï')
+ or tb:cmp('ö') or tb:cmp('ü') -- haben Sie für diese Vokale
+ or tb:cmp('Ö') or tb:cmp('Ü') -- kein Ausweis dabei, mein Herr
+
+ or tb:cmp('á') or tb:cmp('é') or tb:cmp('í')
+ or tb:cmp('Á') or tb:cmp('É') or tb:cmp('Í')
+ or tb:cmp('ó') or tb:cmp('ú')
+ or tb:cmp('Ó') or tb:cmp('Ú')
+
+ or tb:cmp('à') or tb:cmp('è') or tb:cmp('ì')
+ or tb:cmp('À') or tb:cmp('È') or tb:cmp('Ì')
+ or tb:cmp('ò') or tb:cmp('ù') -- not so fast,
+ or tb:cmp('Ò') or tb:cmp('Ù') -- "il capo"
+
+ or tb:cmp('ā') or tb:cmp('ē') or tb:cmp('ī')
+ or tb:cmp('Ā') or tb:cmp('Ē') or tb:cmp('Ī')
+ or tb:cmp('ō') or tb:cmp('ū') -- take that latin
+ or tb:cmp('Ō') or tb:cmp('Ū') -- and also hawaiian
+
+ or tb:cmp('æ') or tb:cmp('Æ') -- sorry elon
+ or tb:cmp('œ') or tb:cmp('Œ') -- sacre bleu
+ or tb:cmp('ij') or tb:cmp('IJ') -- ok wtf dutch
+
+ then dslen = 2 goto done end
+ end
+
+ if start.ct >= 3 then
+ var s = [&uint8](start.ptr) -- for safe unicode comparisons, bc char is dumb
+ if s[0] == 0xe3 and -- eliminate kana
+ ((s[1] == 0x81 and s[2] >= 0x81) or
+ (s[1] == 0x82 and s[2] <= 0x96)) or
+ ((s[1] == 0x82 and s[2] >= 0xa1) or
+ (s[1] == 0x83 and s[2] <= 0xb6))
+ then dslen = 3 goto done end
+ end
+ -- TODO handle more nonroman scripts
+ -- maybe remove consonant pointing in arabic??
+ -- i guess remove vowels from devanagari
+ -- no idea what to do about chinese
+
+ -- no disemvoweling applied, return the current byte as is
+ repl = pstr { ptr = start.ptr, ct = 1 }
+ dslen = 1
+
+ ::done::
+ start:advance(dslen)
+ lib.io.fmt('applied %llu bytes of disemvowelling; adding "%.*s"; continuing with "%.*s"\n', dslen, repl.ct, repl.ptr, start.ct, start.ptr)
+ return repl, start
+end
+
+terra m.disemvowel(pool: &lib.mem.pool, str: m.t): m.t
+ var acc: m.acc acc:pool(pool, str.ct)
+ if str.ct == 0 then str.ct = m.sz(str.ptr) end
+ var cur = str while cur.ct > 0 do
+ var add, cont = disemvowel_codepoint(cur)
+ if add:ref() then acc:ppush(add) end
+ cur = cont
+ end
+ return acc:finalize()
+end
return m
Index: view/profile.tpl
==================================================================
--- view/profile.tpl
+++ view/profile.tpl
@@ -23,11 +23,10 @@
archive
media
associates