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
- options @auxbtn