что за болезненная тяга постить в мастодон?
есть же pixelfed-инстанцы, спецом для постинга картинок. закинул туда, а мастодон-аккаунте форварднул/расшарил/забустил.
Так я именно это и хочу делать.
«Join to enjoy: - 200GB»
ну если pixelfed действительно портит картинки, тогда предпочёл бы хостить их на каком-то S3-хранилище, вставляя в посты через ссылку и тэги/разметку.
Действительно портит. Не портит из известных мне https://pixelfed.art (регистрация закрыта); но там в рулезах упомянуто NO generated images (ну, пока не придирались); да и заполнять аккаунт всякими проходными вещами не хочу.
вставляя в посты через ссылку и тэги/разметку.
В том-то и проблема, что это зделоть в #Mastodon крайне проблематично (если вообще возможно).
![Alt text](https://assets.digitalocean.com/articles/alligator/boo.svg "a title")
@erua Я попробовал — таким макаром картинка вставляется тупо в оригинальном размере, без превью и прочего, разумеется, не влезая в колонку и ломая ленту. Так что это не вариант вообще.
@erua Я как раз в вебморде и смотрел. Она не ресайзит картинку, вставленную через Markdown
![Alt text](https://aaa.bbb/ccc.jpeg "a title")
@erua Всё равно не понимаю: в каком месте ебанулись-то и в чём виноваты? В том, что сделали поддержку Markdown, который конвертирует в </img>, и оно отображается браузером, собсно, так, как и должно?
@erua Ну вот код картинки в таком виде приходит, никаких скриптов на нее не понавешено → браузер отображает так, как должен, т.е. в полном размере. Другие форки вообще не отображают. Кто прав в ситуации, которая вообще не задокументирована — сказать, имхо, сложно.
<img style="max-width: 100%;" src="https://images.weserv.nl/?n=-1&il&url=https://calckey.dvd.moe/file/dvd-calckey/dvd-calckey/c56f62a3-d976-4034-a2f1-6f5358b37663.jpg" alt="Image/photo" loading="eager">
@erua Это личная инициатива хабзиллы же.
![Alt text](https://aaa.bbb/ccc.jpeg "a title")
<img style="max-width: 100%;" src="https://images.weserv.nl/?n=-1&il&url=https://calckey.dvd.moe/file/dvd-calckey/dvd-calckey/c56f62a3-d976-4034-a2f1-6f5358b37663.jpg" alt="Image/photo" loading="eager">
@erua Видимо, то, что max-width — мордоспецифичный атрибут и подставлять его должна сама морда?
@erua Ну. Всё так. Поэтому отдавать html со стилями неправильно.
@erua Хм. Судя по тому, что а) можно писать не только с Markdown-разметкой, но и с html; б) в настройках морды есть галочка «удалять форматирование» — у меня подозрение, что таки в ActivityPub пихают html-разметку.
{
"@context": ["https://www.w3.org/ns/activitystreams",
{"@language": "en"}],
"type": "Note",
"id": "http://postparty.example/p/2415",
"content": "<p>I <em>really</em> like strawberries!</p>",
"source": {
"content": "I *really* like strawberries!",
"mediaType": "text/markdown"}
}
@erua Ну? В ActivityPub пихают html-разметку, как я и предполагал.
"content": "<p>I <em>really</em> like strawberries!</p>",
"source": {
"content": "I *really* like strawberries!",
"mediaType": "text/markdown"}
@erua А если я сообщение в html-разметке наберу, что будет в Source?
А если на мисскеевском диалекте (всратом) Markdown — какой вообще от такого сорца прок принимающей стороне?
@erua Ну там жеж написано черным по зеленому, что source — для редактирования поста автором. А на принимающей стороне должен отображаться приехавший html.
ActivityPub extends the Object by supplying the source property. The source property is intended to convey some sort of source from which the content markup was derived, as a form of provenance, or to support future editing by clients.
Alyssa P. Hacker likes to post to her ActivityPub powered blog via an Emacs client she has written, leveraging Org mode. Later she switches to editing on her phone’s client, which has no idea what text/x-org is or how to render it to HTML, so it provides a text box to edit the original content instead.
@erua Ну переведи тогда, что там на самом деле написано. Может, у меня с английским плохо?
@erua 3-й пункт. Неформатированный текст, безо всяких там сорцов. Т.е. подразумевается, что клиент должен показывать имено content, а не source. Но в случае скачущего текста в Миске — непонятно…
Хотя… Я вот замечал, что разные реализации клиентов не всегда видят зачеркнутый текст, хотя полужирный и курсив — умеют.
Надо, короче, поиграться с html-форматированием.
@erua Т.е. ты утверждаешь, что клиент интерпретирует source, но если его нет или неизвестный тип — то content?
@erua Следи за руками: я пишу вот такой html. Естественно, style игнорится, соблюдаются только полужрный, курсив и зачеркивание.
При нажатии кнопки «изменить» в поле ввода попадает исходный html.
Таким образом, Markdown здесь 100% не участвует.
В общем, как я понимаю, учитывая взаимодействие Mastodon и Misskey с ее всратым Markdown’ом: если клиент узнает тип сорца — наверное, парсит сорц. Иначе - контент, который суть html отфильтрованный до минимального набора безопасных тегов.
Других объяснений происходящей неразберихе у меня нет.
где пишешь
В поле вводе поста, разумеется.
какой JSON фомируется в плане ActivityPub?
Я ж не могу это посмотрет!
@erua Естественно, html выставлен.
@erua
Запрос:
{
“content_type”: “text/html”,
“in_reply_to_id”: null,
“language”: “ru”,
“local_only”: false,
“media_ids”: [],
“poll”: null,
“sensitive”: false,
“spoiler_text”: “”,
“status”: “<p>test</p>”,
“visibility”: “public”
}
Ответ:
{
“id”: “111934698345269000”,
“created_at”: “2024-02-15T09:05:50.825Z”,
“in_reply_to_id”: null,
“in_reply_to_account_id”: null,
“sensitive”: false,
“spoiler_text”: “”,
“visibility”: “public”,
“language”: “ru”,
“uri”: “https://aethy.com/users/johan/statuses/111934698345269000”,
“url”: “https://aethy.com/@johan/111934698345269000”,
“replies_count”: 0,
“reblogs_count”: 0,
“favourites_count”: 0,
“edited_at”: null,
“favourited”: false,
“reblogged”: false,
“muted”: false,
“bookmarked”: false,
“pinned”: false,
“local_only”: false,
“content”: “<p>test</p>”,
“filtered”: [],
“reblog”: null,
“application”: {
“name”: “Web”,
“website”: null
},
“account”: {
“id”: “111125016015385194”,
“username”: “johan”,
“acct”: “johan”,
“display_name”: “Johan”,
“locked”: false,
“bot”: false,
“discoverable”: true,
“group”: false,
“created_at”: “2023-09-25T00:00:00.000Z”,
“note”: “<p>— Тебе здесь не понравится, Сьюзен. Дело в фетишистских религиозных верованиях. Тут проводятся опасные ритуалы.</p>”,
“url”: “https://aethy.com/@johan”,
“uri”: “https://aethy.com/users/johan”,
“avatar”: “https://cdn.aethy.com/accounts/avatars/111/125/016/015/385/194/original/90924dd9143c0e8f.png”,
“avatar_static”: “https://cdn.aethy.com/accounts/avatars/111/125/016/015/385/194/original/90924dd9143c0e8f.png”,
“header”: “https://cdn.aethy.com/accounts/headers/111/125/016/015/385/194/original/c03222c5e36e7d2e.jpg”,
“header_static”: “https://cdn.aethy.com/accounts/headers/111/125/016/015/385/194/original/c03222c5e36e7d2e.jpg”,
“followers_count”: 4,
“following_count”: 1,
“statuses_count”: 6,
“last_status_at”: “2024-02-15”,
“noindex”: false,
“emojis”: [],
“roles”: [],
“fields”: []
},
“media_attachments”: [],
“mentions”: [],
“tags”: [],
“emojis”: [],
“reactions”: [],
“card”: null,
“poll”: null
}
@erua Погоди. ActivityPub — это же сервер-сервер? Веб-клиент шлет то, что выбрал: либо html, либо markdown.
<img src="images/username_t.png" />
<div id="pic"></div>
...
#pic {
background-image: url('images/username_t.png');
display: inline-block; width: 100px; height: 100px;
}
@erua А вот — в случае с Markdown:
{
“content_type”: “text/markdown”,
“in_reply_to_id”: null,
“language”: “ru”,
“local_only”: false,
“media_attributes”: [],
“media_ids”: [],
“poll”: null,
“sensitive”: false,
“spoiler_text”: “”,
“status”: “# Заголовок\n\nТекст сообщения”,
“visibility”: “direct”
}
{
“id”: “111934777808015618”,
“created_at”: “2024-02-15T09:26:03.332Z”,
“in_reply_to_id”: null,
“in_reply_to_account_id”: null,
“sensitive”: false,
“spoiler_text”: “”,
“visibility”: “direct”,
“language”: “ru”,
“uri”: “https://aethy.com/users/johan/statuses/111934777808015618”,
“url”: “https://aethy.com/@johan/111934777808015618”,
“replies_count”: 0,
“reblogs_count”: 0,
“favourites_count”: 0,
“edited_at”: null,
“favourited”: false,
“reblogged”: false,
“muted”: false,
“bookmarked”: false,
“local_only”: false,
“content”: “<h1>Заголовок</h1><p>Текст сообщения</p>”,
“filtered”: [],
“reblog”: null,
“application”: {
“name”: “Web”,
“website”: null
},
“account”: {
“id”: “111125016015385194”,
“username”: “johan”,
“acct”: “johan”,
“display_name”: “Johan”,
“locked”: false,
“bot”: false,
“discoverable”: true,
“group”: false,
“created_at”: “2023-09-25T00:00:00.000Z”,
“note”: “<p>— Тебе здесь не понравится, Сьюзен. Дело в фетишистских религиозных верованиях. Тут проводятся опасные ритуалы.</p>”,
“url”: “https://aethy.com/@johan”,
“uri”: “https://aethy.com/users/johan”,
“avatar”: “https://cdn.aethy.com/accounts/avatars/111/125/016/015/385/194/original/90924dd9143c0e8f.png”,
“avatar_static”: “https://cdn.aethy.com/accounts/avatars/111/125/016/015/385/194/original/90924dd9143c0e8f.png”,
“header”: “https://cdn.aethy.com/accounts/headers/111/125/016/015/385/194/original/c03222c5e36e7d2e.jpg”,
“header_static”: “https://cdn.aethy.com/accounts/headers/111/125/016/015/385/194/original/c03222c5e36e7d2e.jpg”,
“followers_count”: 4,
“following_count”: 1,
“statuses_count”: 6,
“last_status_at”: “2024-02-15”,
“noindex”: false,
“emojis”: [],
“roles”: [],
“fields”: []
},
“media_attachments”: [],
“mentions”: [],
“tags”: [],
“emojis”: [],
“reactions”: [],
“card”: null,
“poll”: null
}
выбираешь писать посты в html-разметке своего front-end'а:
и вот куда оно попадёт в рамках ActivityPub структуры?
внутрь content или же поедет в source.content?
"@context": ["https://www.w3.org/ns/activitystreams", {"@language": "en"}],
"type": "Note",
"id": "http://postparty.example/p/2415",
"content": "<p>I <em>really</em> like strawberries!</p>",
"source": {
"content": "<p>I <em>really</em> like strawberries!</p>",
"mediaType": "text/html"}
А может в ряде случаев будет одинаковым содержимое content и source.content?
Не будет ли на других инстанцах показываться непонятно что, т.к. большая часть front-end'ов и клиентов откажется работать с source.content, ограничатся лишь содержимым content?
Какое подмножество html, чужого и недоверенного все эти front-ent пропустят в своё пространство для отображения?
Насколько это трудоёмко парсить html внутри отображаемого поста, чужого и усекать его по неким цепочкам правил до безопасного подмножества. Ведь постоянно находятся то одни, то другие уязвимости и усечение с парсингом должны работать по легко и быстро формируемым правилам.
Или может разумнее пихать в source.content нормальный markdown, поставив соответственно и "mediaType": "text/markdown",
а внутрь conent тот html, в который, по-твоему, ещё раз, ПО-ТВОЕМУ, должна была бы сконвертироваться разметка текста выполненная в markdown.
Кто из front-end этих самых инстанцев или клиентов не доверяет html-содержимому в content, тот возьмёт source.content и нагенерит по разметке текста такой html, который считает правильным для встраивания в свою веб-морду.
Тем более, что это может быть приложение-клиент не использующий html для отображения пользователю форматированных документов. В различных ОС полно средств для работы с форматированным текстом и документами в виде уже готовых GUI-контролов, а потому приложения markdow-разметку переводит в них напрямую, без промежуточных трансляции.
Моё личное мнение, что никто никогда не будет доверять html-сообщениям пришедшим с других инстанцев. А парсить html внутри всех таких сообщений, ради усещечения до безопасного подмножества — это откровенно стрёмное развлечение. Мировой опыт работы с эл.почтой наглядно показал насколько это всё стрёмно, пытаться создавать «безопасное и разумное подмножество» разметки в html.