Show newer

well, geez, Unicode, just quietly drop version 14.0 when i’m not paying attention, why don’t you

re: technology hot take 

@ljwrites Yeah the original fediverse federation protocol was called OStatus, and was just Atom + Salmon (thing to inform servers of new posts / favourites / etc in real time) + Portable Contacts (extra metadata for defining accounts).

It was replaced by ActivityPub to address the following failings:

1. OStatus was an amalgamation of specifications which weren’t necessarily designed with each other in mind. ActivityPub is one specification and easier to implement.

2. Atom is very verbose, which isn’t a problem for things like blog posts, but it’s a little awkward to be sending this huge chunk of data for a post which just says “awoo”.

3. Atom (and OStatus) were only ever designed with public, general‐use internet publishing in mind, and didn’t have mechanisms for designating the intended audience of a post, which is important for social media. ActivityPub has to, cc, and bcc fields, the same as email.

If you don’t make frequent (multiple times an hour) short posts, don’t care about designating a specific audience, and don’t need the real‐time aspects of social media (like favourites), Atom is still a better solution. We’re just in an awkward place where most people publishing to the internet right now expect at least one of those things.

technology hot take 

@ljwrites you know… the fediverse was originally built on Atom lol

you may not think this is an important issue, and the first post might be a bit misleading (since i would much rather have a locale-independent solution than a locale-dependent one), but personally i think it is VERY important

Show thread

hey eugen stop programming Mastodon for iOS for a second and fix my very important issue github.com/mastodon/mastodon/i

@aescling i'd do at-everyone as like a 👥 sigil, and have it imply local-only and be opt-out for receiving posts

some further fleshed‐out CSS 

html{ Display: Grid; Padding-Block-Start: 2REM; Padding-Block-End: 4REM; Padding-Inline-Start: 1REM; Padding-Inline-End: 1REM; Grid: Auto-Flow / 6FR 4FR; Gap: 1REM; Color: #000000; Background: }
body{ Display: Block; Padding-Block-Start: 6REM; Position: Relative; Margin-Inline-Start: Auto; Margin-Inline-End: 0; Max-Inline-Size: 38EM; Font: Medium / 1.25 Serif; Counter-Reset: SECTION }
body::after{ Display: Block; Clear: Both; Content: "" }
h1,
body>p:First-Child::before{ Display: Block; Margin-Block-Start: 2REM; Margin-Block-End: 2REM; Block-Size: 4REM; Opacity: .75; Font-Size: 3.2REM; Line-Height: 1.25; White-Space: Pre; Text-Align: Center }
body>h1:First-Child,
body>p:First-Child::before{ Position: Absolute; Inset-Block-Start: 0; Inset-Inline-Start: 0; Inset-Inline-End: 0; Margin-Block-Start: 0 }
body>p:First-Child::before{ Content: "…" }
p{ Margin: 0; Text-Align: Justify }
p+p{ Margin-Block-Start: 1EM }
ins[role=note]{ Display: Block; Box-Sizing: Border-Box; Margin-Block-Start: 1REM; Margin-Block-End: 1REM; Border-Block-Start: Thin Solid; Border-Block-End: Thin Solid; Padding: 1EM; Color: ; Background: ; Text-Align: Justify; Text-Decoration: None; Counter-Increment: UNNOTE }
p>ins[role=note]{ Float: Left /* compatibility */; Float: Inline-Start; Clear: Left /* compatibility */; Clear: Inline-Start; Position: Relative; Inset-Inline-End: Calc(-100% - 1REM); Margin-Block-Start: 0; Margin-Block-End: 0; Margin-Inline-End: Calc(-40% / .6); Inline-Size: Calc(40% / .6); Counter-Increment: None }
ins[role=note]::before{ Display: Inline-Block; Margin-Inline-End: .5EM; Min-Inline-Size: 3EM; Background: ; Font-Weight: Bold; Text-Align: Center; Content: "§" Counter(SECTION) ":" Counter(UNNOTE, Upper-Alpha) }
mark+ins[role=note]::before{ Content: "§" Counter(SECTION) ":" Counter(NOTE) }
mark{ Box-Decoration-Break: Clone; Margin: -3PX; Border: 2PX Groove ; Padding: 1PX; Background: ; Counter-Increment: NOTE }
mark::after{ Font-Size: .6EM; Font-Weight: Bold; Line-Height: 1; Vertical-Align: Super; Content: " " Counter(NOTE) }
body>*:First-Child,
hr{ Counter-Increment: SECTION; Counter-Reset: NOTE UNNOTE }

Show thread

@KitRedgrave unfortunately the best solution for that in 2021 is probably <del>embedded SVG</del><ins>custom emoji</ins>

still not entirely sure what emotion tukico represents

Show thread

janice kwan is like dreampunk but filled with hope instead of ennui

good music

@KitRedgrave in more length: ZWJ basically means “form ligature here”. thinking of 🧑‍🌾 as a ligature of 🧑 and 🌾 kind of makes sense; it’s certainly not the most elegant solution, and it was chosen more for political/temporal reasons than accuracy ones (basically, vendors wanted to add a bunch of emoji without waiting for the next Unicode release, and it was questionable whether a lot of those characters would pass muster for atomic encoding anyway. so they defined ligatures between existing characters, and Unicode standardized those).

but the demicolon isn’t a ligature of two semicolons (it doesn’t have the same meaning, and if you showed someone a demicolon, they wouldn’t say “ah yes, that’s two semicolons right there”). plus, forming ligatures from punctuation marks like that doesn’t have any precedent and would be difficult to document. (emoji have a separate data file of sequences, but that’s generally not true for ordinary characters.) it’s its own punctuation mark, so an atomic encoding is best.

that said, there is no rule against fonts encoding their own ligatures above and beyond those defined in unicode. whether encoding demicolon as a ligature of two semicolons is preferable largely depends on what fallback behaviour you want if the font isn’t installed: is a fallback of two semicolons desired? or would you rather use a private‐use character, and make it explicit that it’s not a character with an assigned codepoint in the unicode standard?

@KitRedgrave they’d just encode it atomically; two zwidged semicolons would be a font easter egg more than a unicode one

@aescling (note that the size of annotations isn’t zero, it’s Calc(40% / .6). but the size that annotations take up *in their containing element* is zero, because that width is followed by a negative margin which offsets it.)

@aescling the explicit width of the element (in this example, i wrote this `Inline-Size: Calc(40% / .6)`). this trick only works for annotations of a width predictable from the surrounding context; you can’t use it with annotations whose widths depend on their own contents.

@aescling so the problem being solved here is when you have two annotations, they shouldn’t overlap

using Float: Left plus Clear: Left prevents the overlap by making each annotation come after the end of the previous one

however floats normally do this:

text text blah blah blah, blah
┌───┐blah blah blah
│float │blah bleh bloop
└───┘blorg blah.

relative positioning shifts the float until it is in the margin, but it doesn’t affect the space reserved for it in document flow. to take care of that, we add a negative right margin equal to the width of the float, which effectively pulls the surrounding content in from the right, as if the float had no width.

to see, try disabling the Margin-Right in the web inspector. you’ll see the reserved space. disable Position: Relative, and you’ll see where the float would normally be placed.

@aescling uh, i didn’t look at that when i was writing this, and i’m pretty sure that that didn’t use Grid for sizing the areas (could be wrong), but the technique of using a float with margins that make it effectively 0 width is something i developed for that, yeah

REPOST: the kind of girl who knows about Unicode casefolding :so_cool:

Show older
📟🐱 GlitchCat

A small, community‐oriented Mastodon‐compatible Fediverse (GlitchSoc) instance managed as a joint venture between the cat and KIBI families.