Compare commits

..

No commits in common. "master" and "shadow-cljs" have entirely different histories.

29 changed files with 2432 additions and 2024 deletions

9
.gitignore vendored
View file

@ -11,17 +11,8 @@ pom.xml.asc
.lein-plugins/
.lein-failures
.nrepl-port
package-lock.json
output.calva-repl
.cpcache/
.shadow-cljs/
node_modules/
/public/js
/out
package-lock.json
/.lsp/
/.clj-kondo/
*.pyc
t2
t1

View file

@ -1,55 +0,0 @@
stages:
- build_and_test
- package
- upload
.cljs-job: &cljs
image: "domaindrivenarchitecture/ddadevops-clj-cljs:4.11.3"
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
- .shadow-cljs/
- .m2
before_script:
- export RELEASE_ARTIFACT_TOKEN=$MEISSA_REPO_BUERO_RW
- echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/.npmrc
- npm install
.tag_only: &tag_only
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
when: never
- if: '$CI_COMMIT_TAG =~ /^[0-9]+\.[0-9]+\.[0-9]+$/'
test-cljs:
<<: *cljs
stage: build_and_test
script:
- pyb test_cljs
report-frontend:
<<: *cljs
stage: package
script:
- pyb report_frontend
artifacts:
paths:
- target/build-report.html
package-frontend:
<<: *cljs
stage: package
script:
- pyb package_frontend
artifacts:
paths:
- target/
release-to-forgejo:
<<: *cljs
<<: *tag_only
stage: upload
script:
- pyb publish_artifacts

140
README.md
View file

@ -1,142 +1,20 @@
# dda-masto-embed
Embeds mastodon timline into a html page. Uses JS, no intermediate server required.
![build](https://gitlab.com/domaindrivenarchitecture/dda-masto-embed/-/commits/master) | [![pipeline status](https://gitlab.com/domaindrivenarchitecture/dda-masto-embed/badges/main/pipeline.svg)](https://gitlab.com/domaindrivenarchitecture/dda-masto-embed/-/commits/master)
[<img src="https://domaindrivenarchitecture.org/img/delta-chat.svg" width=20 alt="DeltaChat"> chat over e-mail](mailto:buero@meissa-gmbh.de?subject=community-chat) | [<img src="https://meissa.de/images/parts/contact/mastodon36_hue9b2464f10b18e134322af482b9c915e_5501_filter_14705073121015236177.png" width=20 alt="M"> meissa@social.meissa-gmbh.de](https://social.meissa-gmbh.de/@meissa) | [Blog](https://domaindrivenarchitecture.org) | [Website](https://meissa.de)
# Setup
## In brief
dda-masto-embed embedd either your timeline or replies to a specific post on your website.
* Uses JS, **no intermediate server** required,
* in replies mode you can decide to show only favorited replies in order to do upfront moderation
* example for embedding a timeline at [meissa.de/news](https://meissa.de/news/)
* example for embedding replies to a specific post at [meissa.de/sustainibility_microplastic](https://meissa.de/about-meissa/03plastik-aktion/)
* Download latest version at:
* [dda-masto-embed.js](https://repo.prod.meissa.de/attachments/fd727528-0ab4-42d1-bade-8ff129997315)
* [dda-masto-embed.js.sha256](https://repo.prod.meissa.de/attachments/fd727528-0ab4-42d1-bade-8ff129997315)
* [dda-masto-embed.js.sha512](https://repo.prod.meissa.de/attachments/fd727528-0ab4-42d1-bade-8ff129997315)
* It is **OpenSource** - published under the Apache License, Version 2.0
### css and html as base
Uses a generalized HTML structure with descriptive classes and css grid for styling.
The structure in the css follows the html structure. Both accound mode and replies mode are styled there.
Re-styling your timeline should now be a breeze.
## Include a timeline
Including a timeline needs the following html. The div with id `masto-embed` configures the timeline to be shown.
We use bootstrap for rough styling. More styling is up to you at the moment, help is welcome :-)
```html
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title>masto-embed</title>
<link rel="stylesheet" href="post.css">
</head>
<body>
<div id="masto-embed"
account_name="team"
host_url="https://social.meissa-gmbh.de">
Here the timeline will appear.
</div>
<script src="https://domaindrivenarchitecture.org/downloads/dda-masto-embed.js"></script>
</body>
</html>
```
npm install npx
npm install shadow-cljs
npm install source-map-support --save-dev
npm install mastodon-api
```
Reference:
# Development
* `id` has to be `masto-embed`
* `account_name` is the name of your account.
* `host_url` the url of your mastodon instance.
* Use the `post.css` from the src/main/resources or the public folder.
## Using in reply mode
Including replies of one of your posts will work as follows:
```html
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title>masto-embed</title>
<link rel="stylesheet" href="post.css">
</head>
<body>
<div id="masto-embed"
account_name="team"
replies_to="112432461907918517"
filter_favorited=false
host_url="https://social.meissa-gmbh.de">
Here the timeline will appear.
</div>
<script src="https://domaindrivenarchitecture.org/downloads/dda-masto-embed.js"></script>
</body>
</html>
```
Reference:
* `id` has to be `masto-embed`
* `account_name` is the name of your account.
* `host_url` the url of your mastodon instance.
* `replies_to` the id of your post.
* `filter_favorited=<true|false>` true will show only favorited replies, false will show every answer.
## Dev setup
```bash
npm install -g npx
npm install -g shadow-cljs
npm install -g source-map-support --save-dev
npm install
shadow-cljs node-repl
shadow-cljs watch frontend
```
open browser at http://localhost:8080
Connect your repl for :frontend
## Run the tests
```bash
shadow-cljs compile test
```
## Releasing
### prod release
```bash
#adjust version
vi package.json
git commit -am 'releasing'
git tag -am 'releasing' <version>
git push --follow-tags
# Bump version
vi package.json
git commit -am "version bump" && git push
```
## Development & mirrors
Development happens at: https://repo.prod.meissa.de/meissa/dda-masto-embed
Mirrors are:
* https://codeberg.org/meissa/dda-masto-embed (issues and PR)
* https://gitlab.com/domaindrivenarchitecture/dda-masto-embed (CI issues and PR)
* https://github.com/DomainDrivenArchitecture/dda-masto-embed
## License
Copyright © 2024 meissa GmbH
Licensed under the [Apache License, Version 2.0](LICENSE) (the "License")
Pls. find licenses of our subcomponents [here](doc/SUBCOMPONENT_LICENSE)

133
build.py
View file

@ -1,133 +0,0 @@
from os import environ
from subprocess import run
from pybuilder.core import init, task
from ddadevops import *
default_task = "dev"
base_name = "dda-masto-embed"
name = 'dda-masto-embed'
MODULE = 'not-used'
PROJECT_ROOT_PATH = '.'
version = "1.0.2-dev"
@init
def initialize(project):
project.build_depends_on("ddadevops>=4.7.0")
input = {
"name": name,
"module": MODULE,
"stage": "notused",
"project_root_path": PROJECT_ROOT_PATH,
"build_types": [],
"mixin_types": ["RELEASE"],
"release_primary_build_file": "package.json",
"release_secondary_build_files": [
"build.py"
],
"release_artifact_server_url": "https://repo.prod.meissa.de",
"release_organisation": "meissa",
"release_repository_name": name,
"release_artifacts": [
f"target/{name}.js",
],
"release_main_branch": "master",
}
build = ReleaseMixin(project, input)
build.initialize_build_dir()
@task
def test(project):
test_cljs(project)
@task
def test_cljs(project):
run("shadow-cljs compile test", shell=True, check=True)
run("node target/node-tests.js", shell=True, check=True)
@task
def report_frontend(project):
run("mkdir -p target/frontend-build", shell=True, check=True)
run(
"shadow-cljs run shadow.cljs.build-report frontend target/build-report.html",
shell=True,
check=True,
)
@task
def package_frontend(project):
run("mkdir -p target/", shell=True, check=True)
run("shadow-cljs release frontend", shell=True, check=True)
run(
f"cp public/js/main.js target/{name}.js",
shell=True,
check=True,
)
run(
f"sha256sum target/{name}.js > target/{name}.js.sha256",
shell=True,
check=True,
)
run(
f"sha512sum target/{name}.js > target/{name}.js.sha512",
shell=True,
check=True,
)
@task
def patch(project):
linttest(project, "PATCH")
release(project)
@task
def minor(project):
linttest(project, "MINOR")
release(project)
@task
def major(project):
linttest(project, "MAJOR")
release(project)
@task
def dev(project):
linttest(project, "NONE")
@task
def prepare(project):
build = get_devops_build(project)
build.prepare_release()
@task
def tag(project):
build = get_devops_build(project)
build.tag_bump_and_push_release()
@task
def publish_artifacts(project):
build = get_devops_build(project)
build.publish_artifacts()
def release(project):
prepare(project)
tag(project)
def linttest(project, release_type):
build = get_devops_build(project)
build.update_release_type(release_type)
test_cljs(project)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

View file

@ -1,20 +0,0 @@
:media_attachments
[{:description "Plastikmüll gesammelt",
:meta
{:original
{:width 1500, :height 2000, :size "1500x2000", :aspect 0.75},
:small
{:width 416,
:height 554,
:size "416x554",
:aspect 0.7509025270758123}},
:type "image",
:blurhash "UAFiMmx^9aE1yEjEM|%N0eD%w]t7D$%NR4tR",
:preview_url
"https://cdn.masto.host/socialmeissagmbhde/media_attachments/files/112/432/505/467/393/505/small/0d01ddb07440328e.jpg",
:preview_remote_url nil,
:id "112432505467393505",
:url
"https://cdn.masto.host/socialmeissagmbhde/media_attachments/files/112/432/505/467/393/505/original/0d01ddb07440328e.jpg",
:remote_url nil,
:text_url nil}],

View file

@ -1,88 +0,0 @@
{:mentions
[{:id "109517000301838437",
:username "J12t",
:url "https://social.coop/@J12t",
:acct "J12t@social.coop"}],
:emojis [],
:tags
[{:name "federation",
:url "https://social.meissa-gmbh.de/tags/federation"}
{:name "test", :url "https://social.meissa-gmbh.de/tags/test"}],
:reblog nil,
:replies_count 1,
:in_reply_to_account_id nil,
:reblogs_count 0,
:content
"<p><span class=\"h-card\" translate=\"no\"><a href=\"https://social.coop/@J12t\" class=\"u-url mention\">@<span>J12t</span></a></span> Hi Johannes, do you have a solution for such integration tests in place / planed?</p><p><a href=\"https://codeberg.org/forgejo/forgejo/src/commit/fe3473fc8b7b51e024b1a564fc7f01e385ebfb5e/tests/integration/api_activitypub_repository_test.go#L76-L115\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" translate=\"no\"><span class=\"invisible\">https://</span><span class=\"ellipsis\">codeberg.org/forgejo/forgejo/s</span><span class=\"invisible\">rc/commit/fe3473fc8b7b51e024b1a564fc7f01e385ebfb5e/tests/integration/api_activitypub_repository_test.go#L76-L115</span></a></p><p>Would love to be able to make better integration tests ...</p><p><a href=\"https://social.meissa-gmbh.de/tags/federation\" class=\"mention hashtag\" rel=\"tag\">#<span>federation</span></a> <a href=\"https://social.meissa-gmbh.de/tags/test\" class=\"mention hashtag\" rel=\"tag\">#<span>test</span></a></p>",
:sensitive false,
:favourites_count 1,
:in_reply_to_id nil,
:poll nil,
:account
{:acct "meissa",
:last_status_at "2024-05-15",
:emojis [],
:bot false,
:group false,
:following_count 80,
:avatar_static
"https://cdn.masto.host/socialmeissagmbhde/accounts/avatars/112/400/753/820/571/578/original/fd05f46bcc0c5c69.png",
:roles [],
:fields
[{:name "See also",
:value
"<a href=\"https://meissa.de\" target=\"_blank\" rel=\"nofollow noopener noreferrer me\" translate=\"no\"><span class=\"invisible\">https://</span><span class=\"\">meissa.de</span><span class=\"invisible\"></span></a>",
:verified_at "2024-05-14T09:08:20.463+00:00"}
{:name "OpenPGP",
:value "DF43207F1ABF673D8C7F5D1D756A2A4873B93D34",
:verified_at nil}],
:username "meissa",
:header_static
"https://cdn.masto.host/socialmeissagmbhde/accounts/headers/112/400/753/820/571/578/original/915998366b020667.jpg",
:discoverable true,
:statuses_count 10,
:header
"https://cdn.masto.host/socialmeissagmbhde/accounts/headers/112/400/753/820/571/578/original/915998366b020667.jpg",
:note
"<p>DevOps, Cloud, KI, Clojure, Kotlin, JVM, Python &amp; k8s, Germany, Reutlingen, Tübingen, Stuttgart, genossenschaftlich, OpenSource, TestDriven, Maintainer, Forgejo, Federation</p>",
:noindex false,
:locked false,
:id "112400753820571578",
:avatar
"https://cdn.masto.host/socialmeissagmbhde/accounts/avatars/112/400/753/820/571/578/original/fd05f46bcc0c5c69.png",
:url "https://social.meissa-gmbh.de/@meissa",
:uri "https://social.meissa-gmbh.de/users/meissa",
:display_name "meissa-team",
:followers_count 172,
:created_at "2024-05-07T00:00:00.000Z"},
:card
{:description "forgejo - Beyond coding. We forge.",
:author_url "",
:image_description "",
:width 290,
:type "link",
:embed_url "",
:blurhash "URC3:FsU1xJS-8NvJ9$OFIS3wexEJ9n*xEbG",
:title
"forgejo/tests/integration/api_activitypub_repository_test.go at fe3473fc8b7b51e024b1a564fc7f01e385ebfb5e",
:published_at nil,
:provider_name "Codeberg.org",
:language "en",
:url
"https://codeberg.org//forgejo/forgejo/src/commit/fe3473fc8b7b51e024b1a564fc7f01e385ebfb5e/tests/integration/api_activitypub_repository_test.go",
:author_name "",
:image
"https://cdn.masto.host/socialmeissagmbhde/cache/preview_cards/images/000/545/643/original/199336f5aa5b9683.png",
:provider_url "",
:height 290,
:html ""},
:language "en",
:id "112446229070164194",
:url "https://social.meissa-gmbh.de/@meissa/112446229070164194",
:media_attachments [],
:uri
"https://social.meissa-gmbh.de/users/meissa/statuses/112446229070164194",
:edited_at nil,
:visibility "public",
:created_at "2024-05-15T17:14:50.257Z",
:spoiler_text ""}

2371
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

View file

@ -1,26 +1,12 @@
{
"name": "dda-masto-embed",
"author": "meissa GmbH",
"version": "1.0.2-SNAPSHOT",
"homepage": "https://github.com/DomainDrivenArchitecture/dda-masto-embed",
"repository": "https://github.com/DomainDrivenArchitecture/dda-masto-embed",
"license": "Apache-2.0",
"private": false,
"devDependencies": {
"ajv": "^8.10",
"eslint": ">=8.10.0",
"lodash.template": ">=4.5.0",
"shadow-cljs": "^2.17.8",
"source-map-support": "^0.5.21"
},
"dependencies": {
"mastodon-api": "^1.3.0"
},
"main": "dda-masto-embed.js",
"keywords": [
"cljs",
"mastodon",
"status",
"bootstrap"
]
"name": "dda-masto-embed",
"version": "0.0.1",
"private": true,
"devDependencies": {
"shadow-cljs": "^2.8.100",
"source-map-support": "^0.5.19"
},
"dependencies": {
"mastodon-api": "^1.3.0"
}
}

View file

@ -3,18 +3,9 @@
<head>
<meta charset="utf-8" />
<title>masto-embed</title>
<link rel="stylesheet" href="post.css">
</head>
<body>
<div class="container">
<div id="masto-embed"
account_name="meissa"
host_url="https://social.meissa-gmbh.de"
replies_to="112432461907918517"
filter_favorited=true>
Here the timeline will appear.
</div>
</div>
<div id="root"></div>
<script src="js/main.js"></script>
</body>
</html>

View file

@ -1,358 +0,0 @@
.section.account-mode {
--large: 1em;
--medium: 0.5em;
--small: 0.25em;
margin-bottom: var(--large);
display: grid;
grid: ". post ." / auto auto auto;
font-size: calc(clamp(0.8rem, 19200.75rem - 40000vw, 1.0rem) + max(0.75rem, 0.5rem + 0.5208333vw) - 0.75rem);
overflow-wrap: break-word;
word-wrap: break-word;
word-break: break-word;
.mastodon-post {
grid-area: post;
justify-self: center;
display: grid;
grid:
"header"
"content"
"image"
"link-preview"
"footer" /
minmax(380px, 450px);
border: 1px solid #ccc;
padding: var(--small);
.mastodon-post-header {
grid-area: header;
justify-self: stretch;
display: grid;
grid: "avatar names . date" / max-content max-content auto 20%;
margin: var(--medium);
.mastodon-post-avatar {
grid-area: avatar;
width: auto;
max-height: 60px;
object-fit: contain;
align-self: center;
}
.mastodon-post-names {
grid-area: names;
display: grid;
grid:
"dp-name"
"ac-name" /
auto;
justify-self: start;
margin-left: var(--medium);
.display-name {
grid-area: dp-name;
align-self: end;
text-decoration: none;
color: inherit;
}
.account-name {
grid-area: ac-name;
align-self: start;
text-decoration: none;
color: inherit;
}
}
.mastodon-post-date {
font-size: 85%;
grid-area: date;
justify-self: end;
align-self: center;
margin-right: 1em;
}
}
.mastodon-post-content {
grid-area: content;
display: grid;
grid:
"text"
"image" / 100%;
padding: var(--medium);
.mastodon-post-text {
grid-area: text;
}
.mastodon-post-image {
grid-area: image;
max-width: 100%;
height: auto;
align-self: center;
justify-self: center;
border-radius: 1em;
}
}
.mastodon-post-link-preview {
grid-area: link-preview;
justify-self: center;
display: grid;
grid:
"image"
"info" / 100%;
text-decoration: none;
border: 1px solid #ccc;
border-radius: var(--small);
margin: var(--medium);
.mastodon-post-link-image{
grid-area: image;
justify-self: center;
width: 100%;
height: auto;
object-fit: cover;
border-radius:var(--small);
margin-bottom: var(--small);
}
.mastodon-post-link-info {
grid-area: info;
grid:
"link-title"
"link-description"
"link-url"
/ auto;
padding: var(--small);
.mastodon-post-link-title {
grid-area: link-title;
color: #383838;
font-weight: bold;
}
.mastodon-post-link-description {
grid-area: link-description;
color: #383838;
padding-bottom: var(--medium);
}
.mastodon-post-link-url {
grid-area: link-url;
color: #666;
}
}
}
.mastodon-post-footer {
margin-right: var(--medium);
margin-left: var(--medium);
grid-area: footer;
display: grid;
justify-content: space-between;
grid:
"replies retoots likes"
/ auto auto auto;
padding-top: var(--small);
.footer-button {
background: none;
border: none;
display: flex;
svg {
width: 24px;
height: 24px;
margin-right: var(--small);
}
}
.replies {
justify-self: center;
grid-area: replies;
}
.retoots {
justify-self: center;
grid-area: retoots;
}
.likes {
justify-self: center;
grid-area: likes;
}
.like-count {
justify-self: center;
grid-area: like-count;
}
.retoot-count {
justify-self: center;
grid-area: retoot-count;
}
.reply-count {
justify-self: center;
grid-area: reply-count;
}
}
}
}
.section.replies-mode {
--large: 1em;
--medium: 0.5em;
--small: 0.25em;
margin-bottom: var(--large);
display: grid;
grid: ". post ." / auto auto auto;
font-size: calc(clamp(0.8rem, 19200.75rem - 40000vw, 1.0rem) + max(0.75rem, 0.5rem + 0.5208333vw) - 0.75rem);
.mastodon-post {
grid-area: post;
justify-self: center;
align-self: start;
display: grid;
grid:
"header"
"content"
"image"
"link-preview"
"footer" /
minmax(380px, 450px);
border: 1px solid #ccc;
padding: var(--small);
.mastodon-post-header {
grid-area: header;
justify-self: stretch;
display: grid;
grid: "avatar names . date" / max-content max-content auto 20%;
margin: var(--medium);
.mastodon-post-avatar {
grid-area: avatar;
width: auto;
max-height: 60px;
object-fit: contain;
align-self: center;
}
.mastodon-post-names {
grid-area: names;
display: grid;
grid:
"dp-name"
"ac-name" /
auto;
justify-self: start;
margin-left: var(--medium);
.display-name {
grid-area: dp-name;
align-self: end;
text-decoration: none;
color: inherit;
}
.account-name {
grid-area: ac-name;
align-self: start;
text-decoration: none;
color: inherit;
}
}
.mastodon-post-date {
font-size: 85%;
grid-area: date;
justify-self: end;
align-self: center;
margin-right: 1em;
}
}
.mastodon-post-content {
grid-area: content;
display: grid;
grid:
"image text" / minmax(40%, 108px) auto;
padding: var(--medium);
.mastodon-post-text {
grid-area: text;
align-self: center;
display: grid;
padding: var(--medium) 0 var(--medium) var(--medium);
}
.mastodon-post-image {
grid-area: image;
max-width: 100%;
height: auto;
align-self: center;
justify-self: center;
border-radius: 1em;
}
}
.mastodon-post-link-preview {
grid-area: link-preview;
justify-self: center;
display: grid;
grid:
"image"
"info" / 100%;
text-decoration: none;
border: 1px solid #ccc;
border-radius: var(--small);
margin: var(--medium);
.mastodon-post-link-image{
grid-area: image;
justify-self: center;
width: 100%;
height: auto;
object-fit: cover;
border-radius: var(--small);
margin-bottom: var(--small);
}
.mastodon-post-link-info {
grid-area: info;
grid:
"." "link-title" "."
"." "link-description" "."
"." "link-url" "." / auto auto auto;
padding: var(--small);
.mastodon-post-link-title {
grid-area: link-title;
color: #383838;
font-weight: bold;
}
.mastodon-post-link-description {
color: #383838;
grid-area: link-description;
}
.mastodon-post-link-url {
grid-area: link-url;
color: #666;
}
}
}
.mastodon-post-footer {
display: none;
}
}
}

View file

@ -1,23 +1,17 @@
;; shadow-cljs configuration
{:source-paths
["src/main"
["src/dev"
"src/main"
"src/test"]
:dependencies
[[orchestra "2021.01.01-1"]
[hiccups "0.3.0"]
[org.clj-commons/hickory "0.7.4"]
[com.andrewmcveigh/cljs-time "0.5.2"]
[org.domaindrivenarchitecture/c4k-common-cljs "8.0.0"]]
[]
:dev-http {8080 "public"}
:builds
{:test {:target :node-test
:output-to "target/node-tests.js"
:autorun true}
:lib {:target :node-library
:output-to "target/dda-masto-embed.js"
:exports {:init dda.masto-embed.app/init}
:release {:compiler-options {:optimizations :advanced}}}
:frontend {:target :browser
:modules {:main {:init-fn dda.masto-embed.app/init}}
:release {}}}}
{:test
{:target :node-test
:output-to "out/node-tests.js"
:autorun true}
:frontend
{:target :browser
:modules {:main {:init-fn dda.masto-embed.app/init}}}}}

View file

@ -1,61 +0,0 @@
; Licensed to the Apache Software Foundation (ASF) under one
; or more contributor license agreements. See the NOTICE file
; distributed with this work for additional information
; regarding copyright ownership. The ASF licenses this file
; to you under the Apache License, Version 2.0 (the
; "License"); you may not use this file except in compliance
; with the License. You may obtain a copy of the License at
;
; http://www.apache.org/licenses/LICENSE-2.0
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.
(ns dda.masto-embed.api
(:require
["mastodon-api" :as Mastodon]
[dda.masto-embed.infra :as infra]
[clojure.spec.alpha :as s]
[orchestra.core :refer-macros [defn-spec]]))
(s/def ::account-id string?)
(s/def ::host-url string?)
(defn mastojs->edn [response]
(-> response .-data infra/js->edn))
(defn-spec mastodon-client any?
[host-url ::host-url]
(let [mastodon-config
{:access_token "unused"
:api_url (str host-url "/api/v1/")}]
(some-> mastodon-config clj->js Mastodon.)))
(defn-spec get-account-statuses any?
[host-url ::host-url
account-id ::account-id]
(.get (mastodon-client host-url)
(str "accounts/" account-id "/statuses")
#js {}))
(defn get-replies
[host-url
status-id]
(.get (mastodon-client host-url)
(str "statuses/" status-id "/context")
#js {}))
(defn get-favorited-by
[host-url
status-id]
(.get (mastodon-client host-url)
(str "statuses/" status-id "/favourited_by")
#js {}))
(defn-spec get-directory any?
[host-url ::host-url]
(.get (mastodon-client host-url)
(str "directory?local=true")
#js {}))

View file

@ -1,28 +1,25 @@
; Licensed to the Apache Software Foundation (ASF) under one
; or more contributor license agreements. See the NOTICE file
; distributed with this work for additional information
; regarding copyright ownership. The ASF licenses this file
; to you under the Apache License, Version 2.0 (the
; "License"); you may not use this file except in compliance
; with the License. You may obtain a copy of the License at
;
; http://www.apache.org/licenses/LICENSE-2.0
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.
(ns dda.masto-embed.app
(:require
[dda.masto-embed.browser :as b]
[dda.masto-embed.modes :as m]))
["mastodon-api" :as Mastodon]
[clojure.pprint :as pprint :refer [pprint]]
[cljs.core.async :refer [go]]
[cljs.core.async.interop :refer-macros [<p!]]))
(defn get-content-seq [response]
(map
#(aget % "content")
(array-seq
(aget response "data"))))
(defn init []
(let [host-url (b/host-url-from-document)
account-name (b/account-name-from-document)
replies-to (b/replies-to-from-document)
filter-favorited (b/filter-favorited-from-document)]
(if (nil? replies-to)
(m/account-mode host-url account-name)
(m/replies-mode host-url account-name replies-to filter-favorited))))
(let [config (js-obj "api_url" "https://social.meissa-gmbh.de/api/v1/" "access_token" "...")
masto (new Mastodon config)
rest-endpoint "accounts/:id/statuses"
id-config (js-obj "id" "2")]
(pprint
(go
(let [response (<p! (.get masto rest-endpoint id-config))]
(get-content-seq response))))))
(defn add-one [a]
(+ a 1))

View file

@ -1,51 +0,0 @@
; Licensed to the Apache Software Foundation (ASF) under one
; or more contributor license agreements. See the NOTICE file
; distributed with this work for additional information
; regarding copyright ownership. The ASF licenses this file
; to you under the Apache License, Version 2.0 (the
; "License"); you may not use this file except in compliance
; with the License. You may obtain a copy of the License at
;
; http://www.apache.org/licenses/LICENSE-2.0
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.
(ns dda.masto-embed.browser
(:require
[hickory.core :as h]
[shadow.resource :as rc]))
(def masto-embed "masto-embed")
(def post-html (rc/inline "dda/masto_embed/resources/post.html"))
(defn post-html-hiccup []
(h/as-hiccup (h/parse post-html)))
(defn element-from-document-by-name [name]
(-> js/document
(.getElementById masto-embed)
(.getAttribute name)))
(defn host-url-from-document []
(element-from-document-by-name "host_url"))
(defn account-name-from-document []
(element-from-document-by-name "account_name"))
(defn replies-to-from-document []
(element-from-document-by-name "replies_to"))
(defn filter-favorited-from-document []
(element-from-document-by-name "filter_favorited"))
(defn render-to-document
[input]
(-> js/document
(.getElementById masto-embed)
(.-innerHTML)
(set! input)))

View file

@ -1,29 +0,0 @@
; Licensed to the Apache Software Foundation (ASF) under one
; or more contributor license agreements. See the NOTICE file
; distributed with this work for additional information
; regarding copyright ownership. The ASF licenses this file
; to you under the Apache License, Version 2.0 (the
; "License"); you may not use this file except in compliance
; with the License. You may obtain a copy of the License at
;
; http://www.apache.org/licenses/LICENSE-2.0
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.
(ns dda.masto-embed.infra
(:require
[clojure.pprint :as pprint :refer [pprint]]))
(defn exit-with-error [error]
(js/console.error error)
(js/process.exit 1))
(defn js->edn [data]
(js->clj data :keywordize-keys true))
(defn debug [elem]
(pprint elem)
elem)

View file

@ -1,99 +0,0 @@
; Licensed to the Apache Software Foundation (ASF) under one
; or more contributor license agreements. See the NOTICE file
; distributed with this work for additional information
; regarding copyright ownership. The ASF licenses this file
; to you under the Apache License, Version 2.0 (the
; "License"); you may not use this file except in compliance
; with the License. You may obtain a copy of the License at
;
; http://www.apache.org/licenses/LICENSE-2.0
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.
(ns dda.masto-embed.modes
(:require
[cljs.core.async :refer [go chan <! >!]]
[cljs.core.async.interop :refer-macros [<p!]]
[hiccups.runtime :refer [render-html]]
[dda.masto-embed.api :as api]
[dda.masto-embed.browser :as b]
[dda.masto-embed.to-html :as th]
))
; TODO?: Functions in this ns mix business logic and api calls.
; Should we separate better etween business and infra logic?
(defn favorited-replies? [host-url account-name reply-id]
(let [out (chan)]
(go
(>! out
(->>
(<p! (api/get-favorited-by host-url reply-id))
api/mastojs->edn
(filter #(= account-name (:acct %)))
(seq))))
out))
(defn favorited? [host-url account-name replies]
(let [out (chan)]
(go
(>! out
(loop [loc-replies replies
result []]
(if (empty? loc-replies)
result
(recur (rest loc-replies)
(conj result (<! (favorited-replies? host-url account-name (first loc-replies)))))))))
out))
(defn find-account-id [host-url account-name]
(let [out (chan)]
(go
(>! out
(->>
(<p! (api/get-directory host-url))
api/mastojs->edn
(filter #(= account-name (:acct %)))
(map :id)
first)))
out))
(defn replies-mode-raw [host-url account-name post-id filter-favorited]
(go
(let [replies (->
(<p! (api/get-replies host-url post-id))
api/mastojs->edn)
favorited (<! (favorited? host-url account-name (map :id (:descendants replies))))
combined (map (fn [s f] {:status s :favorited f}) (:descendants replies) favorited)]
(->> combined
(filter #(or (not filter-favorited) (:favorited %)))
(reverse)
(map :status)))))
(defn replies-mode [host-url account-name post-id filter-favorited]
(go
(->> (replies-mode-raw host-url account-name post-id filter-favorited)
(th/masto->html "replies-mode")
(render-html)
(b/render-to-document))))
(defn account-mode-raw [host-url account-name]
(go
(let [account-id (<! (find-account-id host-url account-name))
status (->
(<p! (api/get-account-statuses host-url account-id))
api/mastojs->edn)]
(->> status
(filter #(= nil (:reblog %)))
(filter #(= nil (:in_reply_to_account_id %)))
(take 4)))))
(defn account-mode [host-url account-name]
(go
(->> (account-mode-raw host-url account-name)
(th/masto->html "account-mode")
(render-html)
(b/render-to-document))))

View file

@ -1 +0,0 @@
<img class="mastodon-post-image" src="https://cdn.masto.host/socialmeissagmbhde/media_attachments/files/112/432/505/467/393/505/original/0d01ddb07440328e.jpg"></img>

View file

@ -1 +0,0 @@
<a href="LINK_PREVIEW_URL" class="mastodon-post-link-preview" target="_blank"><img class="mastodon-post-link-image" src="LINK_PREVIEW_IMG_URL"></img><div class="mastodon-post-link-info"><h4 class="mastodon-post-link-title">LINK_PREVIEW_TITLE</h4><div class="mastodon-post-link-description">LINK_PREVIEW_DESC</div><div class="mastodon-post-link-url">LINK_PREVIEW_URL</div></div></a>

View file

@ -1 +0,0 @@
<section class="section post-container"><article class="mastodon-post"><header class="mastodon-post-header"><img class="mastodon-post-avatar" src="AVATAR_URL"></img><div class="mastodon-post-names"><a class="display-name" href="POST_URL">DISPLAY_NAME</a><a class="account-name" href="POST_URL">ACCOUNT_NAME</a></div><time class="mastodon-post-date" datetime="DATETIME">TIME</time></header><section class="mastodon-post-content"><p class="mastodon-post-text">POST_TEXT</p></section><a href="LINK_PREVIEW_URL" class="mastodon-post-link-preview" target="_blank"></a><footer class="mastodon-post-footer"><button class="footer-button replies"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 23.999989 18.905102" fill="currentColor"><path d="M 12.605469 0 C 6.3127313 -3.016065e-07 1.2128906 3.6227598 1.2128906 8.0917969 C 1.2082806 9.3482967 1.6202949 10.587431 2.4179688 11.708984 C 2.4578657 11.764164 2.498768 11.811806 2.5390625 11.865234 C 3.3268045 11.641832 4.3869061 11.848285 5.3300781 12.486328 C 6.3288461 13.162012 6.9253832 14.138795 6.953125 14.988281 C 7.1369873 15.068801 7.3124925 15.149004 7.5117188 15.232422 C 9.0912976 15.798243 10.836341 16.090505 12.605469 16.087891 C 16.920323 16.086691 20.863977 14.35437 22.792969 11.613281 C 23.580255 10.506333 23.991872 9.2846052 23.998047 8.0449219 C 23.962291 3.5975966 18.876044 0 12.605469 0 z M 23.998047 8.0449219 C 23.998174 8.0606359 24 8.0760629 24 8.0917969 L 24 7.9960938 C 24.00006 8.0124607 23.998147 8.0285639 23.998047 8.0449219 z M 2.9121094 12.222656 C 2.2425334 12.223796 1.667313 12.46211 1.3457031 12.9375 C 1.1638316 13.204122 1.077675 13.531936 1.09375 13.890625 C 1.1537212 14.293189 1.209808 14.432962 1.3125 14.671875 C 1.4316055 14.948973 1.7207031 15.40625 1.7207031 15.40625 C 1.9907532 15.764415 2.3364315 16.089696 2.7304688 16.355469 C 3.6907784 17.004767 4.8168668 17.230272 5.640625 16.9375 C 5.9710419 16.821946 6.2362892 16.627161 6.4160156 16.369141 C 7.0592353 15.418362 6.445179 13.878941 5.0449219 12.931641 C 4.3447931 12.457991 3.5816854 12.221516 2.9121094 12.222656 z M 1.0195312 16.197266 C 0.64478833 16.1979 0.32257415 16.331594 0.14257812 16.597656 C 0.040789845 16.746877 -0.007044805 16.928158 0.001953125 17.128906 C 0.035517005 17.35421 0.065572735 17.432694 0.12304688 17.566406 C 0.18970686 17.72149 0.3515625 17.978516 0.3515625 17.978516 C 0.50270196 18.178971 0.69743713 18.361021 0.91796875 18.509766 C 1.4554271 18.873168 2.0858405 18.99784 2.546875 18.833984 C 2.7316813 18.769352 2.8798841 18.661846 2.9804688 18.517578 C 3.3404608 17.985454 2.9965753 17.123927 2.2128906 16.59375 C 1.8210482 16.328648 1.3942742 16.196631 1.0195312 16.197266 z " /></svg><span class="count reply-count">REPLIES_COUNT</span></button><button class="footer-button retoots">src/main/dda/masto_embed/resources/post.html<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 15.292642" fill="currentColor"><path d="M 5.5533678,0 C 3.6714839,2.400492 1.6157603,5.1817846 0,7.362011 c 1.4380083,0 2.4385201,-5.881e-4 3.6172864,0.024507 v 3.36241 c 0,2.591649 -0.00735,3.641069 -0.00735,4.541214 0.9377142,0 1.8786511,0.0025 4.6000315,0.0025 h 9.6117861 c -0.967065,-1.240489 -1.863419,-2.423552 -2.791388,-3.644245 -2.391113,-0.01058 -5.4310727,0 -7.7149168,0 0,-1.389694 0.00491,-2.9515088 0.00491,-4.2863375 H 10.998903 C 9.4664195,5.0599896 7.0361202,1.897534 5.5533678,0 Z m 0.6249377,0 c 0.9523292,1.225788 1.9124438,2.5142572 2.7766839,3.6368923 2.3911146,0.010578 5.4433266,0.00491 7.7271706,0.00491 0,1.3896944 -0.0025,2.9515086 -0.0025,4.2863373 h -3.678556 c 1.532486,2.3020214 3.962784,5.4669284 5.445536,7.3644624 1.881875,-2.400496 3.9376,-5.18424 5.55336,-7.3644663 -1.438009,0 -2.440971,5.881e-4 -3.619738,-0.024507 V 4.5412139 c 0,-2.5916487 0.0098,-3.64106836 0.0098,-4.5412139 -0.937714,0 -1.881102,0 -4.602482,0 z" /></svg><span class="count retoot-count">REBLOGS_COUNT</span></button><button class="footer-button likes"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 22.799999" fill="currentColor"><path d="M 12,18.324 19.416,22.8 17.448,14.364 24,8.688 15.372,7.956 12,0 8.628,7.956 0,8.688 6.552,14.364 4.584,22.8 Z" /></svg><span class="count like-count">FAVOURITES_COUNT</span></button></footer></article></section>

View file

@ -1 +0,0 @@
<section class="section post-container"><article class="mastodon-post"><header class="mastodon-post-header"><img class="mastodon-post-avatar" src="AVATAR_URL"></img><div class="mastodon-post-names"><a class="display-name" href="POST_URL">DISPLAY_NAME</a><a class="account-name" href="POST_URL">ACCOUNT_NAME</a></div><time class="mastodon-post-date" datetime="DATETIME">TIME</time></header><section class="mastodon-post-content"><p class="mastodon-post-text">POST_TEXT</p><img class="mastodon-post-image" src="POST_IMG_URL"></img></section><a href="LINK_PREVIEW_URL" class="mastodon-post-link-preview" target="_blank"><img class="mastodon-post-link-image" src="LINK_PREVIEW_IMG_URL"></img><div class="mastodon-post-link-info"><h4 class="mastodon-post-link-title">LINK_PREVIEW_TITLE</h4><div class="mastodon-post-link-description">LINK_PREVIEW_DESC</div><div class="mastodon-post-link-url">LINK_PREVIEW_URL</div></div></a><footer class="mastodon-post-footer"><button class="footer-button replies"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 23.999989 18.905102" fill="currentColor"><path d="M 12.605469 0 C 6.3127313 -3.016065e-07 1.2128906 3.6227598 1.2128906 8.0917969 C 1.2082806 9.3482967 1.6202949 10.587431 2.4179688 11.708984 C 2.4578657 11.764164 2.498768 11.811806 2.5390625 11.865234 C 3.3268045 11.641832 4.3869061 11.848285 5.3300781 12.486328 C 6.3288461 13.162012 6.9253832 14.138795 6.953125 14.988281 C 7.1369873 15.068801 7.3124925 15.149004 7.5117188 15.232422 C 9.0912976 15.798243 10.836341 16.090505 12.605469 16.087891 C 16.920323 16.086691 20.863977 14.35437 22.792969 11.613281 C 23.580255 10.506333 23.991872 9.2846052 23.998047 8.0449219 C 23.962291 3.5975966 18.876044 0 12.605469 0 z M 23.998047 8.0449219 C 23.998174 8.0606359 24 8.0760629 24 8.0917969 L 24 7.9960938 C 24.00006 8.0124607 23.998147 8.0285639 23.998047 8.0449219 z M 2.9121094 12.222656 C 2.2425334 12.223796 1.667313 12.46211 1.3457031 12.9375 C 1.1638316 13.204122 1.077675 13.531936 1.09375 13.890625 C 1.1537212 14.293189 1.209808 14.432962 1.3125 14.671875 C 1.4316055 14.948973 1.7207031 15.40625 1.7207031 15.40625 C 1.9907532 15.764415 2.3364315 16.089696 2.7304688 16.355469 C 3.6907784 17.004767 4.8168668 17.230272 5.640625 16.9375 C 5.9710419 16.821946 6.2362892 16.627161 6.4160156 16.369141 C 7.0592353 15.418362 6.445179 13.878941 5.0449219 12.931641 C 4.3447931 12.457991 3.5816854 12.221516 2.9121094 12.222656 z M 1.0195312 16.197266 C 0.64478833 16.1979 0.32257415 16.331594 0.14257812 16.597656 C 0.040789845 16.746877 -0.007044805 16.928158 0.001953125 17.128906 C 0.035517005 17.35421 0.065572735 17.432694 0.12304688 17.566406 C 0.18970686 17.72149 0.3515625 17.978516 0.3515625 17.978516 C 0.50270196 18.178971 0.69743713 18.361021 0.91796875 18.509766 C 1.4554271 18.873168 2.0858405 18.99784 2.546875 18.833984 C 2.7316813 18.769352 2.8798841 18.661846 2.9804688 18.517578 C 3.3404608 17.985454 2.9965753 17.123927 2.2128906 16.59375 C 1.8210482 16.328648 1.3942742 16.196631 1.0195312 16.197266 z "/></svg><span class="count reply-count">REPLIES_COUNT</span></button><button class="footer-button retoots"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 15.292642" fill="currentColor"><path d="M 5.5533678,0 C 3.6714839,2.400492 1.6157603,5.1817846 0,7.362011 c 1.4380083,0 2.4385201,-5.881e-4 3.6172864,0.024507 v 3.36241 c 0,2.591649 -0.00735,3.641069 -0.00735,4.541214 0.9377142,0 1.8786511,0.0025 4.6000315,0.0025 h 9.6117861 c -0.967065,-1.240489 -1.863419,-2.423552 -2.791388,-3.644245 -2.391113,-0.01058 -5.4310727,0 -7.7149168,0 0,-1.389694 0.00491,-2.9515088 0.00491,-4.2863375 H 10.998903 C 9.4664195,5.0599896 7.0361202,1.897534 5.5533678,0 Z m 0.6249377,0 c 0.9523292,1.225788 1.9124438,2.5142572 2.7766839,3.6368923 2.3911146,0.010578 5.4433266,0.00491 7.7271706,0.00491 0,1.3896944 -0.0025,2.9515086 -0.0025,4.2863373 h -3.678556 c 1.532486,2.3020214 3.962784,5.4669284 5.445536,7.3644624 1.881875,-2.400496 3.9376,-5.18424 5.55336,-7.3644663 -1.438009,0 -2.440971,5.881e-4 -3.619738,-0.024507 V 4.5412139 c 0,-2.5916487 0.0098,-3.64106836 0.0098,-4.5412139 -0.937714,0 -1.881102,0 -4.602482,0 z"/></svg><span class="count retoot-count">REBLOGS_COUNT</span></button><button class="footer-button likes"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 22.799999" fill="currentColor"><path d="M 12,18.324 19.416,22.8 17.448,14.364 24,8.688 15.372,7.956 12,0 8.628,7.956 0,8.688 6.552,14.364 4.584,22.8 Z"/></svg><span class="count like-count">FAVOURITES_COUNT</span></button></footer></article></section>

View file

@ -1 +0,0 @@
<section class="section post-container"><article class="mastodon-post"><header class="mastodon-post-header"><img class="mastodon-post-avatar" src="AVATAR_URL"></img><div class="mastodon-post-names"><a class="display-name" href="POST_URL">DISPLAY_NAME</a><a class="account-name" href="POST_URL">ACCOUNT_NAME</a></div><time class="mastodon-post-date" datetime="DATETIME">TIME</time></header><section class="mastodon-post-content"><p class="mastodon-post-text">POST_TEXT</p><img class="mastodon-post-image" src="https://cdn.masto.host/socialmeissagmbhde/media_attachments/files/112/432/505/467/393/505/original/0d01ddb07440328e.jpg"></img></section><footer class="mastodon-post-footer"><button class="footer-button replies"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 23.999989 18.905102" fill="currentColor"><path d="M 12.605469 0 C 6.3127313 -3.016065e-07 1.2128906 3.6227598 1.2128906 8.0917969 C 1.2082806 9.3482967 1.6202949 10.587431 2.4179688 11.708984 C 2.4578657 11.764164 2.498768 11.811806 2.5390625 11.865234 C 3.3268045 11.641832 4.3869061 11.848285 5.3300781 12.486328 C 6.3288461 13.162012 6.9253832 14.138795 6.953125 14.988281 C 7.1369873 15.068801 7.3124925 15.149004 7.5117188 15.232422 C 9.0912976 15.798243 10.836341 16.090505 12.605469 16.087891 C 16.920323 16.086691 20.863977 14.35437 22.792969 11.613281 C 23.580255 10.506333 23.991872 9.2846052 23.998047 8.0449219 C 23.962291 3.5975966 18.876044 0 12.605469 0 z M 23.998047 8.0449219 C 23.998174 8.0606359 24 8.0760629 24 8.0917969 L 24 7.9960938 C 24.00006 8.0124607 23.998147 8.0285639 23.998047 8.0449219 z M 2.9121094 12.222656 C 2.2425334 12.223796 1.667313 12.46211 1.3457031 12.9375 C 1.1638316 13.204122 1.077675 13.531936 1.09375 13.890625 C 1.1537212 14.293189 1.209808 14.432962 1.3125 14.671875 C 1.4316055 14.948973 1.7207031 15.40625 1.7207031 15.40625 C 1.9907532 15.764415 2.3364315 16.089696 2.7304688 16.355469 C 3.6907784 17.004767 4.8168668 17.230272 5.640625 16.9375 C 5.9710419 16.821946 6.2362892 16.627161 6.4160156 16.369141 C 7.0592353 15.418362 6.445179 13.878941 5.0449219 12.931641 C 4.3447931 12.457991 3.5816854 12.221516 2.9121094 12.222656 z M 1.0195312 16.197266 C 0.64478833 16.1979 0.32257415 16.331594 0.14257812 16.597656 C 0.040789845 16.746877 -0.007044805 16.928158 0.001953125 17.128906 C 0.035517005 17.35421 0.065572735 17.432694 0.12304688 17.566406 C 0.18970686 17.72149 0.3515625 17.978516 0.3515625 17.978516 C 0.50270196 18.178971 0.69743713 18.361021 0.91796875 18.509766 C 1.4554271 18.873168 2.0858405 18.99784 2.546875 18.833984 C 2.7316813 18.769352 2.8798841 18.661846 2.9804688 18.517578 C 3.3404608 17.985454 2.9965753 17.123927 2.2128906 16.59375 C 1.8210482 16.328648 1.3942742 16.196631 1.0195312 16.197266 z " /></svg><span class="count reply-count">REPLIES_COUNT</span></button><button class="footer-button retoots">src/main/dda/masto_embed/resources/post.html<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 15.292642" fill="currentColor"><path d="M 5.5533678,0 C 3.6714839,2.400492 1.6157603,5.1817846 0,7.362011 c 1.4380083,0 2.4385201,-5.881e-4 3.6172864,0.024507 v 3.36241 c 0,2.591649 -0.00735,3.641069 -0.00735,4.541214 0.9377142,0 1.8786511,0.0025 4.6000315,0.0025 h 9.6117861 c -0.967065,-1.240489 -1.863419,-2.423552 -2.791388,-3.644245 -2.391113,-0.01058 -5.4310727,0 -7.7149168,0 0,-1.389694 0.00491,-2.9515088 0.00491,-4.2863375 H 10.998903 C 9.4664195,5.0599896 7.0361202,1.897534 5.5533678,0 Z m 0.6249377,0 c 0.9523292,1.225788 1.9124438,2.5142572 2.7766839,3.6368923 2.3911146,0.010578 5.4433266,0.00491 7.7271706,0.00491 0,1.3896944 -0.0025,2.9515086 -0.0025,4.2863373 h -3.678556 c 1.532486,2.3020214 3.962784,5.4669284 5.445536,7.3644624 1.881875,-2.400496 3.9376,-5.18424 5.55336,-7.3644663 -1.438009,0 -2.440971,5.881e-4 -3.619738,-0.024507 V 4.5412139 c 0,-2.5916487 0.0098,-3.64106836 0.0098,-4.5412139 -0.937714,0 -1.881102,0 -4.602482,0 z" /></svg><span class="count retoot-count">REBLOGS_COUNT</span></button><button class="footer-button likes"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 22.799999" fill="currentColor"><path d="M 12,18.324 19.416,22.8 17.448,14.364 24,8.688 15.372,7.956 12,0 8.628,7.956 0,8.688 6.552,14.364 4.584,22.8 Z" /></svg><span class="count like-count">FAVOURITES_COUNT</span></button></footer></article></section>

View file

@ -1 +0,0 @@
<section class="section post-container"><article class="mastodon-post"><header class="mastodon-post-header"><img class="mastodon-post-avatar" src="AVATAR_URL"></img><div class="mastodon-post-names"><a class="display-name" href="POST_URL">DISPLAY_NAME</a><a class="account-name" href="POST_URL">ACCOUNT_NAME</a></div><time class="mastodon-post-date" datetime="DATETIME">TIME</time></header><section class="mastodon-post-content"><p class="mastodon-post-text">POST_TEXT</p></section><a href="LINK_PREVIEW_URL" class="mastodon-post-link-preview" target="_blank"><img class="mastodon-post-link-image" src="LINK_PREVIEW_IMG_URL"></img><div class="mastodon-post-link-info"><h4 class="mastodon-post-link-title">LINK_PREVIEW_TITLE</h4><div class="mastodon-post-link-description">LINK_PREVIEW_DESC</div><div class="mastodon-post-link-url">LINK_PREVIEW_URL</div></div></a><footer class="mastodon-post-footer"><button class="footer-button replies"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 23.999989 18.905102" fill="currentColor"><path d="M 12.605469 0 C 6.3127313 -3.016065e-07 1.2128906 3.6227598 1.2128906 8.0917969 C 1.2082806 9.3482967 1.6202949 10.587431 2.4179688 11.708984 C 2.4578657 11.764164 2.498768 11.811806 2.5390625 11.865234 C 3.3268045 11.641832 4.3869061 11.848285 5.3300781 12.486328 C 6.3288461 13.162012 6.9253832 14.138795 6.953125 14.988281 C 7.1369873 15.068801 7.3124925 15.149004 7.5117188 15.232422 C 9.0912976 15.798243 10.836341 16.090505 12.605469 16.087891 C 16.920323 16.086691 20.863977 14.35437 22.792969 11.613281 C 23.580255 10.506333 23.991872 9.2846052 23.998047 8.0449219 C 23.962291 3.5975966 18.876044 0 12.605469 0 z M 23.998047 8.0449219 C 23.998174 8.0606359 24 8.0760629 24 8.0917969 L 24 7.9960938 C 24.00006 8.0124607 23.998147 8.0285639 23.998047 8.0449219 z M 2.9121094 12.222656 C 2.2425334 12.223796 1.667313 12.46211 1.3457031 12.9375 C 1.1638316 13.204122 1.077675 13.531936 1.09375 13.890625 C 1.1537212 14.293189 1.209808 14.432962 1.3125 14.671875 C 1.4316055 14.948973 1.7207031 15.40625 1.7207031 15.40625 C 1.9907532 15.764415 2.3364315 16.089696 2.7304688 16.355469 C 3.6907784 17.004767 4.8168668 17.230272 5.640625 16.9375 C 5.9710419 16.821946 6.2362892 16.627161 6.4160156 16.369141 C 7.0592353 15.418362 6.445179 13.878941 5.0449219 12.931641 C 4.3447931 12.457991 3.5816854 12.221516 2.9121094 12.222656 z M 1.0195312 16.197266 C 0.64478833 16.1979 0.32257415 16.331594 0.14257812 16.597656 C 0.040789845 16.746877 -0.007044805 16.928158 0.001953125 17.128906 C 0.035517005 17.35421 0.065572735 17.432694 0.12304688 17.566406 C 0.18970686 17.72149 0.3515625 17.978516 0.3515625 17.978516 C 0.50270196 18.178971 0.69743713 18.361021 0.91796875 18.509766 C 1.4554271 18.873168 2.0858405 18.99784 2.546875 18.833984 C 2.7316813 18.769352 2.8798841 18.661846 2.9804688 18.517578 C 3.3404608 17.985454 2.9965753 17.123927 2.2128906 16.59375 C 1.8210482 16.328648 1.3942742 16.196631 1.0195312 16.197266 z " /></svg><span class="count reply-count">REPLIES_COUNT</span></button><button class="footer-button retoots">src/main/dda/masto_embed/resources/post.html<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 15.292642" fill="currentColor"><path d="M 5.5533678,0 C 3.6714839,2.400492 1.6157603,5.1817846 0,7.362011 c 1.4380083,0 2.4385201,-5.881e-4 3.6172864,0.024507 v 3.36241 c 0,2.591649 -0.00735,3.641069 -0.00735,4.541214 0.9377142,0 1.8786511,0.0025 4.6000315,0.0025 h 9.6117861 c -0.967065,-1.240489 -1.863419,-2.423552 -2.791388,-3.644245 -2.391113,-0.01058 -5.4310727,0 -7.7149168,0 0,-1.389694 0.00491,-2.9515088 0.00491,-4.2863375 H 10.998903 C 9.4664195,5.0599896 7.0361202,1.897534 5.5533678,0 Z m 0.6249377,0 c 0.9523292,1.225788 1.9124438,2.5142572 2.7766839,3.6368923 2.3911146,0.010578 5.4433266,0.00491 7.7271706,0.00491 0,1.3896944 -0.0025,2.9515086 -0.0025,4.2863373 h -3.678556 c 1.532486,2.3020214 3.962784,5.4669284 5.445536,7.3644624 1.881875,-2.400496 3.9376,-5.18424 5.55336,-7.3644663 -1.438009,0 -2.440971,5.881e-4 -3.619738,-0.024507 V 4.5412139 c 0,-2.5916487 0.0098,-3.64106836 0.0098,-4.5412139 -0.937714,0 -1.881102,0 -4.602482,0 z" /></svg><span class="count retoot-count">REBLOGS_COUNT</span></button><button class="footer-button likes"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 22.799999" fill="currentColor"><path d="M 12,18.324 19.416,22.8 17.448,14.364 24,8.688 15.372,7.956 12,0 8.628,7.956 0,8.688 6.552,14.364 4.584,22.8 Z" /></svg><span class="count like-count">FAVOURITES_COUNT</span></button></footer></article></section>

View file

@ -1,358 +0,0 @@
.section.account-mode {
--large: 1em;
--medium: 0.5em;
--small: 0.25em;
margin-bottom: var(--large);
display: grid;
grid: ". post ." / auto auto auto;
font-size: calc(clamp(0.8rem, 19200.75rem - 40000vw, 1.0rem) + max(0.75rem, 0.5rem + 0.5208333vw) - 0.75rem);
overflow-wrap: break-word;
word-wrap: break-word;
word-break: break-word;
.mastodon-post {
grid-area: post;
justify-self: center;
display: grid;
grid:
"header"
"content"
"image"
"link-preview"
"footer" /
minmax(380px, 450px);
border: 1px solid #ccc;
padding: var(--small);
.mastodon-post-header {
grid-area: header;
justify-self: stretch;
display: grid;
grid: "avatar names . date" / max-content max-content auto 20%;
margin: var(--medium);
.mastodon-post-avatar {
grid-area: avatar;
width: auto;
max-height: 60px;
object-fit: contain;
align-self: center;
}
.mastodon-post-names {
grid-area: names;
display: grid;
grid:
"dp-name"
"ac-name" /
auto;
justify-self: start;
margin-left: var(--medium);
.display-name {
grid-area: dp-name;
align-self: end;
text-decoration: none;
color: inherit;
}
.account-name {
grid-area: ac-name;
align-self: start;
text-decoration: none;
color: inherit;
}
}
.mastodon-post-date {
font-size: 85%;
grid-area: date;
justify-self: end;
align-self: center;
margin-right: 1em;
}
}
.mastodon-post-content {
grid-area: content;
display: grid;
grid:
"text"
"image" / 100%;
padding: var(--medium);
.mastodon-post-text {
grid-area: text;
}
.mastodon-post-image {
grid-area: image;
max-width: 100%;
height: auto;
align-self: center;
justify-self: center;
border-radius: 1em;
}
}
.mastodon-post-link-preview {
grid-area: link-preview;
justify-self: center;
display: grid;
grid:
"image"
"info" / 100%;
text-decoration: none;
border: 1px solid #ccc;
border-radius: var(--small);
margin: var(--medium);
.mastodon-post-link-image{
grid-area: image;
justify-self: center;
width: 100%;
height: auto;
object-fit: cover;
border-radius:var(--small);
margin-bottom: var(--small);
}
.mastodon-post-link-info {
grid-area: info;
grid:
"link-title"
"link-description"
"link-url"
/ auto;
padding: var(--small);
.mastodon-post-link-title {
grid-area: link-title;
color: #383838;
font-weight: bold;
}
.mastodon-post-link-description {
grid-area: link-description;
color: #383838;
padding-bottom: var(--medium);
}
.mastodon-post-link-url {
grid-area: link-url;
color: #666;
}
}
}
.mastodon-post-footer {
margin-right: var(--medium);
margin-left: var(--medium);
grid-area: footer;
display: grid;
justify-content: space-between;
grid:
"replies retoots likes"
/ auto auto auto;
padding-top: var(--small);
.footer-button {
background: none;
border: none;
display: flex;
svg {
width: 24px;
height: 24px;
margin-right: var(--small);
}
}
.replies {
justify-self: center;
grid-area: replies;
}
.retoots {
justify-self: center;
grid-area: retoots;
}
.likes {
justify-self: center;
grid-area: likes;
}
.like-count {
justify-self: center;
grid-area: like-count;
}
.retoot-count {
justify-self: center;
grid-area: retoot-count;
}
.reply-count {
justify-self: center;
grid-area: reply-count;
}
}
}
}
.section.replies-mode {
--large: 1em;
--medium: 0.5em;
--small: 0.25em;
margin-bottom: var(--large);
display: grid;
grid: ". post ." / auto auto auto;
font-size: calc(clamp(0.8rem, 19200.75rem - 40000vw, 1.0rem) + max(0.75rem, 0.5rem + 0.5208333vw) - 0.75rem);
.mastodon-post {
grid-area: post;
justify-self: center;
align-self: start;
display: grid;
grid:
"header"
"content"
"image"
"link-preview"
"footer" /
minmax(380px, 450px);
border: 1px solid #ccc;
padding: var(--small);
.mastodon-post-header {
grid-area: header;
justify-self: stretch;
display: grid;
grid: "avatar names . date" / max-content max-content auto 20%;
margin: var(--medium);
.mastodon-post-avatar {
grid-area: avatar;
width: auto;
max-height: 60px;
object-fit: contain;
align-self: center;
}
.mastodon-post-names {
grid-area: names;
display: grid;
grid:
"dp-name"
"ac-name" /
auto;
justify-self: start;
margin-left: var(--medium);
.display-name {
grid-area: dp-name;
align-self: end;
text-decoration: none;
color: inherit;
}
.account-name {
grid-area: ac-name;
align-self: start;
text-decoration: none;
color: inherit;
}
}
.mastodon-post-date {
font-size: 85%;
grid-area: date;
justify-self: end;
align-self: center;
margin-right: 1em;
}
}
.mastodon-post-content {
grid-area: content;
display: grid;
grid:
"image text" / minmax(40%, 108px) auto;
padding: var(--medium);
.mastodon-post-text {
grid-area: text;
align-self: center;
display: grid;
padding: var(--medium) 0 var(--medium) var(--medium);
}
.mastodon-post-image {
grid-area: image;
max-width: 100%;
height: auto;
align-self: center;
justify-self: center;
border-radius: 1em;
}
}
.mastodon-post-link-preview {
grid-area: link-preview;
justify-self: center;
display: grid;
grid:
"image"
"info" / 100%;
text-decoration: none;
border: 1px solid #ccc;
border-radius: var(--small);
margin: var(--medium);
.mastodon-post-link-image{
grid-area: image;
justify-self: center;
width: 100%;
height: auto;
object-fit: cover;
border-radius: var(--small);
margin-bottom: var(--small);
}
.mastodon-post-link-info {
grid-area: info;
grid:
"." "link-title" "."
"." "link-description" "."
"." "link-url" "." / auto auto auto;
padding: var(--small);
.mastodon-post-link-title {
grid-area: link-title;
color: #383838;
font-weight: bold;
}
.mastodon-post-link-description {
color: #383838;
grid-area: link-description;
}
.mastodon-post-link-url {
grid-area: link-url;
color: #666;
}
}
}
.mastodon-post-footer {
display: none;
}
}
}

View file

@ -1,29 +0,0 @@
<section class="section MODE">
<article class="mastodon-post">
<header class="mastodon-post-header">
<img class="mastodon-post-avatar" src="AVATAR_URL"></img>
<div class="mastodon-post-names">
<a class="display-name" href="POST_URL">DISPLAY_NAME</a>
<a class="account-name" href="POST_URL">ACCOUNT_NAME</a>
</div>
<time class="mastodon-post-date" datetime="DATETIME">TIME</time>
</header>
<section class="mastodon-post-content">
<div class="mastodon-post-text">POST_TEXT</div>
</section>
<footer class="mastodon-post-footer"><button class="footer-button replies"><svg xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 23.999989 18.905102" fill="currentColor">
<path
d="M 12.605469 0 C 6.3127313 -3.016065e-07 1.2128906 3.6227598 1.2128906 8.0917969 C 1.2082806 9.3482967 1.6202949 10.587431 2.4179688 11.708984 C 2.4578657 11.764164 2.498768 11.811806 2.5390625 11.865234 C 3.3268045 11.641832 4.3869061 11.848285 5.3300781 12.486328 C 6.3288461 13.162012 6.9253832 14.138795 6.953125 14.988281 C 7.1369873 15.068801 7.3124925 15.149004 7.5117188 15.232422 C 9.0912976 15.798243 10.836341 16.090505 12.605469 16.087891 C 16.920323 16.086691 20.863977 14.35437 22.792969 11.613281 C 23.580255 10.506333 23.991872 9.2846052 23.998047 8.0449219 C 23.962291 3.5975966 18.876044 0 12.605469 0 z M 23.998047 8.0449219 C 23.998174 8.0606359 24 8.0760629 24 8.0917969 L 24 7.9960938 C 24.00006 8.0124607 23.998147 8.0285639 23.998047 8.0449219 z M 2.9121094 12.222656 C 2.2425334 12.223796 1.667313 12.46211 1.3457031 12.9375 C 1.1638316 13.204122 1.077675 13.531936 1.09375 13.890625 C 1.1537212 14.293189 1.209808 14.432962 1.3125 14.671875 C 1.4316055 14.948973 1.7207031 15.40625 1.7207031 15.40625 C 1.9907532 15.764415 2.3364315 16.089696 2.7304688 16.355469 C 3.6907784 17.004767 4.8168668 17.230272 5.640625 16.9375 C 5.9710419 16.821946 6.2362892 16.627161 6.4160156 16.369141 C 7.0592353 15.418362 6.445179 13.878941 5.0449219 12.931641 C 4.3447931 12.457991 3.5816854 12.221516 2.9121094 12.222656 z M 1.0195312 16.197266 C 0.64478833 16.1979 0.32257415 16.331594 0.14257812 16.597656 C 0.040789845 16.746877 -0.007044805 16.928158 0.001953125 17.128906 C 0.035517005 17.35421 0.065572735 17.432694 0.12304688 17.566406 C 0.18970686 17.72149 0.3515625 17.978516 0.3515625 17.978516 C 0.50270196 18.178971 0.69743713 18.361021 0.91796875 18.509766 C 1.4554271 18.873168 2.0858405 18.99784 2.546875 18.833984 C 2.7316813 18.769352 2.8798841 18.661846 2.9804688 18.517578 C 3.3404608 17.985454 2.9965753 17.123927 2.2128906 16.59375 C 1.8210482 16.328648 1.3942742 16.196631 1.0195312 16.197266 z " />
</svg><span class="count reply-count">REPLIES_COUNT</span></button><button
class="footer-button retoots"><svg
xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 15.292642" fill="currentColor">
<path
d="M 5.5533678,0 C 3.6714839,2.400492 1.6157603,5.1817846 0,7.362011 c 1.4380083,0 2.4385201,-5.881e-4 3.6172864,0.024507 v 3.36241 c 0,2.591649 -0.00735,3.641069 -0.00735,4.541214 0.9377142,0 1.8786511,0.0025 4.6000315,0.0025 h 9.6117861 c -0.967065,-1.240489 -1.863419,-2.423552 -2.791388,-3.644245 -2.391113,-0.01058 -5.4310727,0 -7.7149168,0 0,-1.389694 0.00491,-2.9515088 0.00491,-4.2863375 H 10.998903 C 9.4664195,5.0599896 7.0361202,1.897534 5.5533678,0 Z m 0.6249377,0 c 0.9523292,1.225788 1.9124438,2.5142572 2.7766839,3.6368923 2.3911146,0.010578 5.4433266,0.00491 7.7271706,0.00491 0,1.3896944 -0.0025,2.9515086 -0.0025,4.2863373 h -3.678556 c 1.532486,2.3020214 3.962784,5.4669284 5.445536,7.3644624 1.881875,-2.400496 3.9376,-5.18424 5.55336,-7.3644663 -1.438009,0 -2.440971,5.881e-4 -3.619738,-0.024507 V 4.5412139 c 0,-2.5916487 0.0098,-3.64106836 0.0098,-4.5412139 -0.937714,0 -1.881102,0 -4.602482,0 z" />
</svg><span class="count retoot-count">REBLOGS_COUNT</span></button><button class="footer-button likes"><svg
xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 22.799999" fill="currentColor">
<path
d="M 12,18.324 19.416,22.8 17.448,14.364 24,8.688 15.372,7.956 12,0 8.628,7.956 0,8.688 6.552,14.364 4.584,22.8 Z" />
</svg><span class="count like-count">FAVOURITES_COUNT</span></button></footer>
</article>
</section>

View file

@ -1,112 +0,0 @@
; Licensed to the Apache Software Foundation (ASF) under one
; or more contributor license agreements. See the NOTICE file
; distributed with this work for additional information
; regarding copyright ownership. The ASF licenses this file
; to you under the Apache License, Version 2.0 (the
; "License"); you may not use this file except in compliance
; with the License. You may obtain a copy of the License at
;
; http://www.apache.org/licenses/LICENSE-2.0
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.
(ns dda.masto-embed.to-html
(:require
[cljs-time.format :as t]
[dda.masto-embed.browser :as b]
[dda.c4k-common.common :as cm]
[clojure.walk :refer [postwalk]]))
(def link_preview
[:a
{:href "LINK_PREVIEW_URL", :class "mastodon-post-link-preview", :target "_blank"}
[:img {:class "mastodon-post-link-image", :src "LINK_PREVIEW_IMG_URL"}]
[:div
{:class "mastodon-post-link-info"}
[:h4 {:class "mastodon-post-link-title"} "LINK_PREVIEW_TITLE"]
[:div {:class "mastodon-post-link-description"} "LINK_PREVIEW_DESC"]
[:div {:class "mastodon-post-link-url"} "LINK_PREVIEW_URL"]]])
(defn insert [v i e] (vec (concat (subvec v 0 i) [e] (subvec v i))))
(defn truncate [s n] (subs s 0 (min (count s) n)))
(defn masto-header->html [html account created_at url]
(let [{:keys [username display_name avatar_static]} account
date (t/parse created_at)]
(-> html
(cm/replace-all-matching "AVATAR_URL" avatar_static)
(cm/replace-all-matching "POST_URL" url)
(cm/replace-all-matching "DISPLAY_NAME" display_name)
(cm/replace-all-matching "ACCOUNT_NAME" (str "@" username))
(cm/replace-all-matching "DATETIME" created_at)
(cm/replace-all-matching "TIME" (t/unparse (t/formatter "EEEE, dd MMMM yyyy") date)))))
(defn masto-content->html [html content]
(-> html
(cm/replace-all-matching "POST_TEXT" content)))
; Meant to be used in postwalk on hiccup/hickory html-representation
(defn insert-into-content [item insertion-element]
(let [condition (if (vector? item)
(every? true? [(= (first item) :section)
(= (:class (second item)) "mastodon-post-content")])
false)]
(if condition
(conj item insertion-element)
item)))
(defn insert-into-post [item index insertion-element]
(let [condition (if (vector? item)
(every? true? [(= (first item) :article)
(= (:class (second item)) "mastodon-post")])
false)]
(if condition
(insert item index insertion-element)
item)))
(defn masto-media->html [html media_attachments]
(if-let [preview-image-url (get-in media_attachments [0 :preview_url])]
(let [image-element [:img {:class "mastodon-post-image", :src preview-image-url}]]
(postwalk #(insert-into-content % image-element) html))
html))
(defn insert-link-prev [html]
(postwalk #(insert-into-post % 4 link_preview) html))
(defn masto-link-prev->html [html card]
(let [{:keys [url image title description]} card]
(if (nil? card)
html
(-> html
(insert-link-prev)
(cm/replace-all-matching "LINK_PREVIEW_URL" url)
(cm/replace-all-matching "LINK_PREVIEW_IMG_URL" image)
(cm/replace-all-matching "LINK_PREVIEW_TITLE" (str (truncate title 47) "..."))
(cm/replace-all-matching "LINK_PREVIEW_DESC" description)))))
(defn masto-footer->html [html replies_count reblogs_count favourites_count]
(-> html
(cm/replace-all-matching "REPLIES_COUNT" replies_count)
(cm/replace-all-matching "REBLOGS_COUNT" reblogs_count)
(cm/replace-all-matching "FAVOURITES_COUNT" favourites_count)))
(defn insert-mode [html mode]
(-> html
(cm/replace-all-matching "section MODE" (str "section " mode))))
(defn masto->html [mode statuses]
(let [html (b/post-html-hiccup)]
(map (fn [status]
(let [{:keys [account created_at content media_attachments replies_count reblogs_count favourites_count card url]} status]
(-> html
(masto-header->html account created_at url)
(masto-content->html content)
(masto-media->html media_attachments)
(masto-link-prev->html card)
(masto-footer->html replies_count reblogs_count favourites_count)
(insert-mode mode))))
statuses)))

View file

@ -0,0 +1,8 @@
(ns dda.masto-embed.app-test
(:require
[cljs.test :refer (deftest is)]
[dda.masto-embed.app :as sut]))
(deftest a-failing-test
(is (= 3
(sut/add-one 2))))

View file

@ -1,319 +0,0 @@
(ns dda.masto-embed.data-helpers)
(def complete-template-post-hiccup
[:html
{}
[:head {}]
[:body
{}
[:section
{:class "section post-container"}
[:article
{:class "mastodon-post"}
[:header
{:class "mastodon-post-header"}
[:img {:class "mastodon-post-avatar", :src "AVATAR_URL"}]
[:div
{:class "mastodon-post-names"}
[:a {:class "display-name", :href "POST_URL"} "DISPLAY_NAME"]
[:a {:class "account-name", :href "POST_URL"} "ACCOUNT_NAME"]]
[:time {:class "mastodon-post-date", :datetime "DATETIME"} "TIME"]]
[:section
{:class "mastodon-post-content"}
[:p {:class "mastodon-post-text"} "POST_TEXT"]
[:img {:class "mastodon-post-image", :src "POST_IMG_URL"}]]
[:a
{:href "LINK_PREVIEW_URL", :class "mastodon-post-link-preview", :target "_blank"}
[:img {:class "mastodon-post-link-image", :src "LINK_PREVIEW_IMG_URL"}]
[:div
{:class "mastodon-post-link-info"}
[:h4 {:class "mastodon-post-link-title"} "LINK_PREVIEW_TITLE"]
[:div {:class "mastodon-post-link-description"} "LINK_PREVIEW_DESC"]
[:div {:class "mastodon-post-link-url"} "LINK_PREVIEW_URL"]]]
[:footer
{:class "mastodon-post-footer"}
[:button
{:class "footer-button replies"}
[:svg
{:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 23.999989 18.905102", :fill "currentColor"}
[:path
{:d
"M 12.605469 0 C 6.3127313 -3.016065e-07 1.2128906 3.6227598 1.2128906 8.0917969 C 1.2082806 9.3482967 1.6202949 10.587431 2.4179688 11.708984 C 2.4578657 11.764164 2.498768 11.811806 2.5390625 11.865234 C 3.3268045 11.641832 4.3869061 11.848285 5.3300781 12.486328 C 6.3288461 13.162012 6.9253832 14.138795 6.953125 14.988281 C 7.1369873 15.068801 7.3124925 15.149004 7.5117188 15.232422 C 9.0912976 15.798243 10.836341 16.090505 12.605469 16.087891 C 16.920323 16.086691 20.863977 14.35437 22.792969 11.613281 C 23.580255 10.506333 23.991872 9.2846052 23.998047 8.0449219 C 23.962291 3.5975966 18.876044 0 12.605469 0 z M 23.998047 8.0449219 C 23.998174 8.0606359 24 8.0760629 24 8.0917969 L 24 7.9960938 C 24.00006 8.0124607 23.998147 8.0285639 23.998047 8.0449219 z M 2.9121094 12.222656 C 2.2425334 12.223796 1.667313 12.46211 1.3457031 12.9375 C 1.1638316 13.204122 1.077675 13.531936 1.09375 13.890625 C 1.1537212 14.293189 1.209808 14.432962 1.3125 14.671875 C 1.4316055 14.948973 1.7207031 15.40625 1.7207031 15.40625 C 1.9907532 15.764415 2.3364315 16.089696 2.7304688 16.355469 C 3.6907784 17.004767 4.8168668 17.230272 5.640625 16.9375 C 5.9710419 16.821946 6.2362892 16.627161 6.4160156 16.369141 C 7.0592353 15.418362 6.445179 13.878941 5.0449219 12.931641 C 4.3447931 12.457991 3.5816854 12.221516 2.9121094 12.222656 z M 1.0195312 16.197266 C 0.64478833 16.1979 0.32257415 16.331594 0.14257812 16.597656 C 0.040789845 16.746877 -0.007044805 16.928158 0.001953125 17.128906 C 0.035517005 17.35421 0.065572735 17.432694 0.12304688 17.566406 C 0.18970686 17.72149 0.3515625 17.978516 0.3515625 17.978516 C 0.50270196 18.178971 0.69743713 18.361021 0.91796875 18.509766 C 1.4554271 18.873168 2.0858405 18.99784 2.546875 18.833984 C 2.7316813 18.769352 2.8798841 18.661846 2.9804688 18.517578 C 3.3404608 17.985454 2.9965753 17.123927 2.2128906 16.59375 C 1.8210482 16.328648 1.3942742 16.196631 1.0195312 16.197266 z "}]]
[:span {:class "count reply-count"} "REPLIES_COUNT"]]
[:button
{:class "footer-button retoots"}
[:svg
{:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 15.292642", :fill "currentColor"}
[:path
{:d
"M 5.5533678,0 C 3.6714839,2.400492 1.6157603,5.1817846 0,7.362011 c 1.4380083,0 2.4385201,-5.881e-4 3.6172864,0.024507 v 3.36241 c 0,2.591649 -0.00735,3.641069 -0.00735,4.541214 0.9377142,0 1.8786511,0.0025 4.6000315,0.0025 h 9.6117861 c -0.967065,-1.240489 -1.863419,-2.423552 -2.791388,-3.644245 -2.391113,-0.01058 -5.4310727,0 -7.7149168,0 0,-1.389694 0.00491,-2.9515088 0.00491,-4.2863375 H 10.998903 C 9.4664195,5.0599896 7.0361202,1.897534 5.5533678,0 Z m 0.6249377,0 c 0.9523292,1.225788 1.9124438,2.5142572 2.7766839,3.6368923 2.3911146,0.010578 5.4433266,0.00491 7.7271706,0.00491 0,1.3896944 -0.0025,2.9515086 -0.0025,4.2863373 h -3.678556 c 1.532486,2.3020214 3.962784,5.4669284 5.445536,7.3644624 1.881875,-2.400496 3.9376,-5.18424 5.55336,-7.3644663 -1.438009,0 -2.440971,5.881e-4 -3.619738,-0.024507 V 4.5412139 c 0,-2.5916487 0.0098,-3.64106836 0.0098,-4.5412139 -0.937714,0 -1.881102,0 -4.602482,0 z"}]]
[:span {:class "count retoot-count"} "REBLOGS_COUNT"]]
[:button
{:class "footer-button likes"}
[:svg
{:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 22.799999", :fill "currentColor"}
[:path
{:d
"M 12,18.324 19.416,22.8 17.448,14.364 24,8.688 15.372,7.956 12,0 8.628,7.956 0,8.688 6.552,14.364 4.584,22.8 Z"}]]
[:span {:class "count like-count"} "FAVOURITES_COUNT"]]]]]]])
; complete-template-post-hiccup without link prev and img
(def post-base-img
[:html
{}
[:head {}]
[:body
{}
[:section
{:class "section post-container"}
[:article
{:class "mastodon-post"}
[:header
{:class "mastodon-post-header"}
[:img {:class "mastodon-post-avatar", :src "AVATAR_URL"}]
[:div
{:class "mastodon-post-names"}
[:a {:class "display-name", :href "POST_URL"} "DISPLAY_NAME"]
[:a {:class "account-name", :href "POST_URL"} "ACCOUNT_NAME"]]
[:time {:class "mastodon-post-date", :datetime "DATETIME"} "TIME"]]
[:section
{:class "mastodon-post-content"}
[:p {:class "mastodon-post-text"} "POST_TEXT"]]
[:footer
{:class "mastodon-post-footer"}
[:button
{:class "footer-button replies"}
[:svg
{:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 23.999989 18.905102", :fill "currentColor"}
[:path
{:d
"M 12.605469 0 C 6.3127313 -3.016065e-07 1.2128906 3.6227598 1.2128906 8.0917969 C 1.2082806 9.3482967 1.6202949 10.587431 2.4179688 11.708984 C 2.4578657 11.764164 2.498768 11.811806 2.5390625 11.865234 C 3.3268045 11.641832 4.3869061 11.848285 5.3300781 12.486328 C 6.3288461 13.162012 6.9253832 14.138795 6.953125 14.988281 C 7.1369873 15.068801 7.3124925 15.149004 7.5117188 15.232422 C 9.0912976 15.798243 10.836341 16.090505 12.605469 16.087891 C 16.920323 16.086691 20.863977 14.35437 22.792969 11.613281 C 23.580255 10.506333 23.991872 9.2846052 23.998047 8.0449219 C 23.962291 3.5975966 18.876044 0 12.605469 0 z M 23.998047 8.0449219 C 23.998174 8.0606359 24 8.0760629 24 8.0917969 L 24 7.9960938 C 24.00006 8.0124607 23.998147 8.0285639 23.998047 8.0449219 z M 2.9121094 12.222656 C 2.2425334 12.223796 1.667313 12.46211 1.3457031 12.9375 C 1.1638316 13.204122 1.077675 13.531936 1.09375 13.890625 C 1.1537212 14.293189 1.209808 14.432962 1.3125 14.671875 C 1.4316055 14.948973 1.7207031 15.40625 1.7207031 15.40625 C 1.9907532 15.764415 2.3364315 16.089696 2.7304688 16.355469 C 3.6907784 17.004767 4.8168668 17.230272 5.640625 16.9375 C 5.9710419 16.821946 6.2362892 16.627161 6.4160156 16.369141 C 7.0592353 15.418362 6.445179 13.878941 5.0449219 12.931641 C 4.3447931 12.457991 3.5816854 12.221516 2.9121094 12.222656 z M 1.0195312 16.197266 C 0.64478833 16.1979 0.32257415 16.331594 0.14257812 16.597656 C 0.040789845 16.746877 -0.007044805 16.928158 0.001953125 17.128906 C 0.035517005 17.35421 0.065572735 17.432694 0.12304688 17.566406 C 0.18970686 17.72149 0.3515625 17.978516 0.3515625 17.978516 C 0.50270196 18.178971 0.69743713 18.361021 0.91796875 18.509766 C 1.4554271 18.873168 2.0858405 18.99784 2.546875 18.833984 C 2.7316813 18.769352 2.8798841 18.661846 2.9804688 18.517578 C 3.3404608 17.985454 2.9965753 17.123927 2.2128906 16.59375 C 1.8210482 16.328648 1.3942742 16.196631 1.0195312 16.197266 z "}]]
[:span {:class "count reply-count"} "REPLIES_COUNT"]]
[:button
{:class "footer-button retoots"}
[:svg
{:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 15.292642", :fill "currentColor"}
[:path
{:d
"M 5.5533678,0 C 3.6714839,2.400492 1.6157603,5.1817846 0,7.362011 c 1.4380083,0 2.4385201,-5.881e-4 3.6172864,0.024507 v 3.36241 c 0,2.591649 -0.00735,3.641069 -0.00735,4.541214 0.9377142,0 1.8786511,0.0025 4.6000315,0.0025 h 9.6117861 c -0.967065,-1.240489 -1.863419,-2.423552 -2.791388,-3.644245 -2.391113,-0.01058 -5.4310727,0 -7.7149168,0 0,-1.389694 0.00491,-2.9515088 0.00491,-4.2863375 H 10.998903 C 9.4664195,5.0599896 7.0361202,1.897534 5.5533678,0 Z m 0.6249377,0 c 0.9523292,1.225788 1.9124438,2.5142572 2.7766839,3.6368923 2.3911146,0.010578 5.4433266,0.00491 7.7271706,0.00491 0,1.3896944 -0.0025,2.9515086 -0.0025,4.2863373 h -3.678556 c 1.532486,2.3020214 3.962784,5.4669284 5.445536,7.3644624 1.881875,-2.400496 3.9376,-5.18424 5.55336,-7.3644663 -1.438009,0 -2.440971,5.881e-4 -3.619738,-0.024507 V 4.5412139 c 0,-2.5916487 0.0098,-3.64106836 0.0098,-4.5412139 -0.937714,0 -1.881102,0 -4.602482,0 z"}]]
[:span {:class "count retoot-count"} "REBLOGS_COUNT"]]
[:button
{:class "footer-button likes"}
[:svg
{:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 22.799999", :fill "currentColor"}
[:path
{:d
"M 12,18.324 19.416,22.8 17.448,14.364 24,8.688 15.372,7.956 12,0 8.628,7.956 0,8.688 6.552,14.364 4.584,22.8 Z"}]]
[:span {:class "count like-count"} "FAVOURITES_COUNT"]]]]]]])
(def post-with-img
[:html
{}
[:head {}]
[:body
{}
[:section
{:class "section post-container"}
[:article
{:class "mastodon-post"}
[:header
{:class "mastodon-post-header"}
[:img {:class "mastodon-post-avatar", :src "AVATAR_URL"}]
[:div
{:class "mastodon-post-names"}
[:a {:class "display-name", :href "POST_URL"} "DISPLAY_NAME"]
[:a {:class "account-name", :href "POST_URL"} "ACCOUNT_NAME"]]
[:time {:class "mastodon-post-date", :datetime "DATETIME"} "TIME"]]
[:section
{:class "mastodon-post-content"}
[:p {:class "mastodon-post-text"} "POST_TEXT"]
[:img
{:class "mastodon-post-image",
:src "https://cdn.masto.host/socialmeissagmbhde/media_attachments/files/112/432/505/467/393/505/small/0d01ddb07440328e.jpg"}]]
[:footer
{:class "mastodon-post-footer"}
[:button
{:class "footer-button replies"}
[:svg
{:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 23.999989 18.905102", :fill "currentColor"}
[:path
{:d
"M 12.605469 0 C 6.3127313 -3.016065e-07 1.2128906 3.6227598 1.2128906 8.0917969 C 1.2082806 9.3482967 1.6202949 10.587431 2.4179688 11.708984 C 2.4578657 11.764164 2.498768 11.811806 2.5390625 11.865234 C 3.3268045 11.641832 4.3869061 11.848285 5.3300781 12.486328 C 6.3288461 13.162012 6.9253832 14.138795 6.953125 14.988281 C 7.1369873 15.068801 7.3124925 15.149004 7.5117188 15.232422 C 9.0912976 15.798243 10.836341 16.090505 12.605469 16.087891 C 16.920323 16.086691 20.863977 14.35437 22.792969 11.613281 C 23.580255 10.506333 23.991872 9.2846052 23.998047 8.0449219 C 23.962291 3.5975966 18.876044 0 12.605469 0 z M 23.998047 8.0449219 C 23.998174 8.0606359 24 8.0760629 24 8.0917969 L 24 7.9960938 C 24.00006 8.0124607 23.998147 8.0285639 23.998047 8.0449219 z M 2.9121094 12.222656 C 2.2425334 12.223796 1.667313 12.46211 1.3457031 12.9375 C 1.1638316 13.204122 1.077675 13.531936 1.09375 13.890625 C 1.1537212 14.293189 1.209808 14.432962 1.3125 14.671875 C 1.4316055 14.948973 1.7207031 15.40625 1.7207031 15.40625 C 1.9907532 15.764415 2.3364315 16.089696 2.7304688 16.355469 C 3.6907784 17.004767 4.8168668 17.230272 5.640625 16.9375 C 5.9710419 16.821946 6.2362892 16.627161 6.4160156 16.369141 C 7.0592353 15.418362 6.445179 13.878941 5.0449219 12.931641 C 4.3447931 12.457991 3.5816854 12.221516 2.9121094 12.222656 z M 1.0195312 16.197266 C 0.64478833 16.1979 0.32257415 16.331594 0.14257812 16.597656 C 0.040789845 16.746877 -0.007044805 16.928158 0.001953125 17.128906 C 0.035517005 17.35421 0.065572735 17.432694 0.12304688 17.566406 C 0.18970686 17.72149 0.3515625 17.978516 0.3515625 17.978516 C 0.50270196 18.178971 0.69743713 18.361021 0.91796875 18.509766 C 1.4554271 18.873168 2.0858405 18.99784 2.546875 18.833984 C 2.7316813 18.769352 2.8798841 18.661846 2.9804688 18.517578 C 3.3404608 17.985454 2.9965753 17.123927 2.2128906 16.59375 C 1.8210482 16.328648 1.3942742 16.196631 1.0195312 16.197266 z "}]]
[:span {:class "count reply-count"} "REPLIES_COUNT"]]
[:button
{:class "footer-button retoots"}
[:svg
{:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 15.292642", :fill "currentColor"}
[:path
{:d
"M 5.5533678,0 C 3.6714839,2.400492 1.6157603,5.1817846 0,7.362011 c 1.4380083,0 2.4385201,-5.881e-4 3.6172864,0.024507 v 3.36241 c 0,2.591649 -0.00735,3.641069 -0.00735,4.541214 0.9377142,0 1.8786511,0.0025 4.6000315,0.0025 h 9.6117861 c -0.967065,-1.240489 -1.863419,-2.423552 -2.791388,-3.644245 -2.391113,-0.01058 -5.4310727,0 -7.7149168,0 0,-1.389694 0.00491,-2.9515088 0.00491,-4.2863375 H 10.998903 C 9.4664195,5.0599896 7.0361202,1.897534 5.5533678,0 Z m 0.6249377,0 c 0.9523292,1.225788 1.9124438,2.5142572 2.7766839,3.6368923 2.3911146,0.010578 5.4433266,0.00491 7.7271706,0.00491 0,1.3896944 -0.0025,2.9515086 -0.0025,4.2863373 h -3.678556 c 1.532486,2.3020214 3.962784,5.4669284 5.445536,7.3644624 1.881875,-2.400496 3.9376,-5.18424 5.55336,-7.3644663 -1.438009,0 -2.440971,5.881e-4 -3.619738,-0.024507 V 4.5412139 c 0,-2.5916487 0.0098,-3.64106836 0.0098,-4.5412139 -0.937714,0 -1.881102,0 -4.602482,0 z"}]]
[:span {:class "count retoot-count"} "REBLOGS_COUNT"]]
[:button
{:class "footer-button likes"}
[:svg
{:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 22.799999", :fill "currentColor"}
[:path
{:d
"M 12,18.324 19.416,22.8 17.448,14.364 24,8.688 15.372,7.956 12,0 8.628,7.956 0,8.688 6.552,14.364 4.584,22.8 Z"}]]
[:span {:class "count like-count"} "FAVOURITES_COUNT"]]]]]]])
; complete-template-post-hiccup without link prev and img
(def post-base-prev
[:html
{}
[:head {}]
[:body
{}
[:section
{:class "section post-container"}
[:article
{:class "mastodon-post"}
[:header
{:class "mastodon-post-header"}
[:img {:class "mastodon-post-avatar", :src "AVATAR_URL"}]
[:div
{:class "mastodon-post-names"}
[:a {:class "display-name", :href "POST_URL"} "DISPLAY_NAME"]
[:a {:class "account-name", :href "POST_URL"} "ACCOUNT_NAME"]]
[:time {:class "mastodon-post-date", :datetime "DATETIME"} "TIME"]]
[:section
{:class "mastodon-post-content"}
[:p {:class "mastodon-post-text"} "POST_TEXT"]]
[:footer
{:class "mastodon-post-footer"}
[:button
{:class "footer-button replies"}
[:svg
{:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 23.999989 18.905102", :fill "currentColor"}
[:path
{:d
"M 12.605469 0 C 6.3127313 -3.016065e-07 1.2128906 3.6227598 1.2128906 8.0917969 C 1.2082806 9.3482967 1.6202949 10.587431 2.4179688 11.708984 C 2.4578657 11.764164 2.498768 11.811806 2.5390625 11.865234 C 3.3268045 11.641832 4.3869061 11.848285 5.3300781 12.486328 C 6.3288461 13.162012 6.9253832 14.138795 6.953125 14.988281 C 7.1369873 15.068801 7.3124925 15.149004 7.5117188 15.232422 C 9.0912976 15.798243 10.836341 16.090505 12.605469 16.087891 C 16.920323 16.086691 20.863977 14.35437 22.792969 11.613281 C 23.580255 10.506333 23.991872 9.2846052 23.998047 8.0449219 C 23.962291 3.5975966 18.876044 0 12.605469 0 z M 23.998047 8.0449219 C 23.998174 8.0606359 24 8.0760629 24 8.0917969 L 24 7.9960938 C 24.00006 8.0124607 23.998147 8.0285639 23.998047 8.0449219 z M 2.9121094 12.222656 C 2.2425334 12.223796 1.667313 12.46211 1.3457031 12.9375 C 1.1638316 13.204122 1.077675 13.531936 1.09375 13.890625 C 1.1537212 14.293189 1.209808 14.432962 1.3125 14.671875 C 1.4316055 14.948973 1.7207031 15.40625 1.7207031 15.40625 C 1.9907532 15.764415 2.3364315 16.089696 2.7304688 16.355469 C 3.6907784 17.004767 4.8168668 17.230272 5.640625 16.9375 C 5.9710419 16.821946 6.2362892 16.627161 6.4160156 16.369141 C 7.0592353 15.418362 6.445179 13.878941 5.0449219 12.931641 C 4.3447931 12.457991 3.5816854 12.221516 2.9121094 12.222656 z M 1.0195312 16.197266 C 0.64478833 16.1979 0.32257415 16.331594 0.14257812 16.597656 C 0.040789845 16.746877 -0.007044805 16.928158 0.001953125 17.128906 C 0.035517005 17.35421 0.065572735 17.432694 0.12304688 17.566406 C 0.18970686 17.72149 0.3515625 17.978516 0.3515625 17.978516 C 0.50270196 18.178971 0.69743713 18.361021 0.91796875 18.509766 C 1.4554271 18.873168 2.0858405 18.99784 2.546875 18.833984 C 2.7316813 18.769352 2.8798841 18.661846 2.9804688 18.517578 C 3.3404608 17.985454 2.9965753 17.123927 2.2128906 16.59375 C 1.8210482 16.328648 1.3942742 16.196631 1.0195312 16.197266 z "}]]
[:span {:class "count reply-count"} "REPLIES_COUNT"]]
[:button
{:class "footer-button retoots"}
[:svg
{:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 15.292642", :fill "currentColor"}
[:path
{:d
"M 5.5533678,0 C 3.6714839,2.400492 1.6157603,5.1817846 0,7.362011 c 1.4380083,0 2.4385201,-5.881e-4 3.6172864,0.024507 v 3.36241 c 0,2.591649 -0.00735,3.641069 -0.00735,4.541214 0.9377142,0 1.8786511,0.0025 4.6000315,0.0025 h 9.6117861 c -0.967065,-1.240489 -1.863419,-2.423552 -2.791388,-3.644245 -2.391113,-0.01058 -5.4310727,0 -7.7149168,0 0,-1.389694 0.00491,-2.9515088 0.00491,-4.2863375 H 10.998903 C 9.4664195,5.0599896 7.0361202,1.897534 5.5533678,0 Z m 0.6249377,0 c 0.9523292,1.225788 1.9124438,2.5142572 2.7766839,3.6368923 2.3911146,0.010578 5.4433266,0.00491 7.7271706,0.00491 0,1.3896944 -0.0025,2.9515086 -0.0025,4.2863373 h -3.678556 c 1.532486,2.3020214 3.962784,5.4669284 5.445536,7.3644624 1.881875,-2.400496 3.9376,-5.18424 5.55336,-7.3644663 -1.438009,0 -2.440971,5.881e-4 -3.619738,-0.024507 V 4.5412139 c 0,-2.5916487 0.0098,-3.64106836 0.0098,-4.5412139 -0.937714,0 -1.881102,0 -4.602482,0 z"}]]
[:span {:class "count retoot-count"} "REBLOGS_COUNT"]]
[:button
{:class "footer-button likes"}
[:svg
{:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 22.799999", :fill "currentColor"}
[:path
{:d
"M 12,18.324 19.416,22.8 17.448,14.364 24,8.688 15.372,7.956 12,0 8.628,7.956 0,8.688 6.552,14.364 4.584,22.8 Z"}]]
[:span {:class "count like-count"} "FAVOURITES_COUNT"]]]]]]])
(def post-with-prev
[:html
{}
[:head {}]
[:body
{}
[:section
{:class "section post-container"}
[:article
{:class "mastodon-post"}
[:header
{:class "mastodon-post-header"}
[:img {:class "mastodon-post-avatar", :src "AVATAR_URL"}]
[:div
{:class "mastodon-post-names"}
[:a {:class "display-name", :href "POST_URL"} "DISPLAY_NAME"]
[:a {:class "account-name", :href "POST_URL"} "ACCOUNT_NAME"]]
[:time {:class "mastodon-post-date", :datetime "DATETIME"} "TIME"]]
[:section
{:class "mastodon-post-content"}
[:p {:class "mastodon-post-text"} "POST_TEXT"]]
[:a
{:href "LINK_PREVIEW_URL", :class "mastodon-post-link-preview", :target "_blank"}
[:img {:class "mastodon-post-link-image", :src "LINK_PREVIEW_IMG_URL"}]
[:div
{:class "mastodon-post-link-info"}
[:h4 {:class "mastodon-post-link-title"} "LINK_PREVIEW_TITLE"]
[:div {:class "mastodon-post-link-description"} "LINK_PREVIEW_DESC"]
[:div {:class "mastodon-post-link-url"} "LINK_PREVIEW_URL"]]]
[:footer
{:class "mastodon-post-footer"}
[:button
{:class "footer-button replies"}
[:svg
{:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 23.999989 18.905102", :fill "currentColor"}
[:path
{:d
"M 12.605469 0 C 6.3127313 -3.016065e-07 1.2128906 3.6227598 1.2128906 8.0917969 C 1.2082806 9.3482967 1.6202949 10.587431 2.4179688 11.708984 C 2.4578657 11.764164 2.498768 11.811806 2.5390625 11.865234 C 3.3268045 11.641832 4.3869061 11.848285 5.3300781 12.486328 C 6.3288461 13.162012 6.9253832 14.138795 6.953125 14.988281 C 7.1369873 15.068801 7.3124925 15.149004 7.5117188 15.232422 C 9.0912976 15.798243 10.836341 16.090505 12.605469 16.087891 C 16.920323 16.086691 20.863977 14.35437 22.792969 11.613281 C 23.580255 10.506333 23.991872 9.2846052 23.998047 8.0449219 C 23.962291 3.5975966 18.876044 0 12.605469 0 z M 23.998047 8.0449219 C 23.998174 8.0606359 24 8.0760629 24 8.0917969 L 24 7.9960938 C 24.00006 8.0124607 23.998147 8.0285639 23.998047 8.0449219 z M 2.9121094 12.222656 C 2.2425334 12.223796 1.667313 12.46211 1.3457031 12.9375 C 1.1638316 13.204122 1.077675 13.531936 1.09375 13.890625 C 1.1537212 14.293189 1.209808 14.432962 1.3125 14.671875 C 1.4316055 14.948973 1.7207031 15.40625 1.7207031 15.40625 C 1.9907532 15.764415 2.3364315 16.089696 2.7304688 16.355469 C 3.6907784 17.004767 4.8168668 17.230272 5.640625 16.9375 C 5.9710419 16.821946 6.2362892 16.627161 6.4160156 16.369141 C 7.0592353 15.418362 6.445179 13.878941 5.0449219 12.931641 C 4.3447931 12.457991 3.5816854 12.221516 2.9121094 12.222656 z M 1.0195312 16.197266 C 0.64478833 16.1979 0.32257415 16.331594 0.14257812 16.597656 C 0.040789845 16.746877 -0.007044805 16.928158 0.001953125 17.128906 C 0.035517005 17.35421 0.065572735 17.432694 0.12304688 17.566406 C 0.18970686 17.72149 0.3515625 17.978516 0.3515625 17.978516 C 0.50270196 18.178971 0.69743713 18.361021 0.91796875 18.509766 C 1.4554271 18.873168 2.0858405 18.99784 2.546875 18.833984 C 2.7316813 18.769352 2.8798841 18.661846 2.9804688 18.517578 C 3.3404608 17.985454 2.9965753 17.123927 2.2128906 16.59375 C 1.8210482 16.328648 1.3942742 16.196631 1.0195312 16.197266 z "}]]
[:span {:class "count reply-count"} "REPLIES_COUNT"]]
[:button
{:class "footer-button retoots"}
[:svg
{:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 15.292642", :fill "currentColor"}
[:path
{:d
"M 5.5533678,0 C 3.6714839,2.400492 1.6157603,5.1817846 0,7.362011 c 1.4380083,0 2.4385201,-5.881e-4 3.6172864,0.024507 v 3.36241 c 0,2.591649 -0.00735,3.641069 -0.00735,4.541214 0.9377142,0 1.8786511,0.0025 4.6000315,0.0025 h 9.6117861 c -0.967065,-1.240489 -1.863419,-2.423552 -2.791388,-3.644245 -2.391113,-0.01058 -5.4310727,0 -7.7149168,0 0,-1.389694 0.00491,-2.9515088 0.00491,-4.2863375 H 10.998903 C 9.4664195,5.0599896 7.0361202,1.897534 5.5533678,0 Z m 0.6249377,0 c 0.9523292,1.225788 1.9124438,2.5142572 2.7766839,3.6368923 2.3911146,0.010578 5.4433266,0.00491 7.7271706,0.00491 0,1.3896944 -0.0025,2.9515086 -0.0025,4.2863373 h -3.678556 c 1.532486,2.3020214 3.962784,5.4669284 5.445536,7.3644624 1.881875,-2.400496 3.9376,-5.18424 5.55336,-7.3644663 -1.438009,0 -2.440971,5.881e-4 -3.619738,-0.024507 V 4.5412139 c 0,-2.5916487 0.0098,-3.64106836 0.0098,-4.5412139 -0.937714,0 -1.881102,0 -4.602482,0 z"}]]
[:span {:class "count retoot-count"} "REBLOGS_COUNT"]]
[:button
{:class "footer-button likes"}
[:svg
{:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 22.799999", :fill "currentColor"}
[:path
{:d
"M 12,18.324 19.416,22.8 17.448,14.364 24,8.688 15.372,7.956 12,0 8.628,7.956 0,8.688 6.552,14.364 4.584,22.8 Z"}]]
[:span {:class "count like-count"} "FAVOURITES_COUNT"]]]]]]])
(def filled-post-with-prev
[:html
{}
[:head {}]
[:body
{}
[:section
{:class "section post-container"}
[:article
{:class "mastodon-post"}
[:header
{:class "mastodon-post-header"}
[:img {:class "mastodon-post-avatar", :src "AVATAR_URL"}]
[:div
{:class "mastodon-post-names"}
[:a {:class "display-name", :href "POST_URL"} "DISPLAY_NAME"]
[:a {:class "account-name", :href "POST_URL"} "ACCOUNT_NAME"]]
[:time {:class "mastodon-post-date", :datetime "DATETIME"} "TIME"]]
[:section
{:class "mastodon-post-content"}
[:p {:class "mastodon-post-text"} "POST_TEXT"]]
[:a
{:href "https://codeberg.org//forgejo/forgejo/src/commit/fe3473fc8b7b51e024b1a564fc7f01e385ebfb5e/tests/integration/api_activitypub_repository_test.go", :class "mastodon-post-link-preview", :target "_blank"}
[:img {:class "mastodon-post-link-image", :src "https://cdn.masto.host/socialmeissagmbhde/cache/preview_cards/images/000/545/643/original/199336f5aa5b9683.png"}]
[:div
{:class "mastodon-post-link-info"}
[:h4 {:class "mastodon-post-link-title"} "forgejo/tests/integration/api_activitypub_repos..."]
[:div {:class "mastodon-post-link-description"} "forgejo - Beyond coding. We forge."]
[:div {:class "mastodon-post-link-url"} "https://codeberg.org//forgejo/forgejo/src/commit/fe3473fc8b7b51e024b1a564fc7f01e385ebfb5e/tests/integration/api_activitypub_repository_test.go"]]]
[:footer
{:class "mastodon-post-footer"}
[:button
{:class "footer-button replies"}
[:svg
{:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 23.999989 18.905102", :fill "currentColor"}
[:path
{:d
"M 12.605469 0 C 6.3127313 -3.016065e-07 1.2128906 3.6227598 1.2128906 8.0917969 C 1.2082806 9.3482967 1.6202949 10.587431 2.4179688 11.708984 C 2.4578657 11.764164 2.498768 11.811806 2.5390625 11.865234 C 3.3268045 11.641832 4.3869061 11.848285 5.3300781 12.486328 C 6.3288461 13.162012 6.9253832 14.138795 6.953125 14.988281 C 7.1369873 15.068801 7.3124925 15.149004 7.5117188 15.232422 C 9.0912976 15.798243 10.836341 16.090505 12.605469 16.087891 C 16.920323 16.086691 20.863977 14.35437 22.792969 11.613281 C 23.580255 10.506333 23.991872 9.2846052 23.998047 8.0449219 C 23.962291 3.5975966 18.876044 0 12.605469 0 z M 23.998047 8.0449219 C 23.998174 8.0606359 24 8.0760629 24 8.0917969 L 24 7.9960938 C 24.00006 8.0124607 23.998147 8.0285639 23.998047 8.0449219 z M 2.9121094 12.222656 C 2.2425334 12.223796 1.667313 12.46211 1.3457031 12.9375 C 1.1638316 13.204122 1.077675 13.531936 1.09375 13.890625 C 1.1537212 14.293189 1.209808 14.432962 1.3125 14.671875 C 1.4316055 14.948973 1.7207031 15.40625 1.7207031 15.40625 C 1.9907532 15.764415 2.3364315 16.089696 2.7304688 16.355469 C 3.6907784 17.004767 4.8168668 17.230272 5.640625 16.9375 C 5.9710419 16.821946 6.2362892 16.627161 6.4160156 16.369141 C 7.0592353 15.418362 6.445179 13.878941 5.0449219 12.931641 C 4.3447931 12.457991 3.5816854 12.221516 2.9121094 12.222656 z M 1.0195312 16.197266 C 0.64478833 16.1979 0.32257415 16.331594 0.14257812 16.597656 C 0.040789845 16.746877 -0.007044805 16.928158 0.001953125 17.128906 C 0.035517005 17.35421 0.065572735 17.432694 0.12304688 17.566406 C 0.18970686 17.72149 0.3515625 17.978516 0.3515625 17.978516 C 0.50270196 18.178971 0.69743713 18.361021 0.91796875 18.509766 C 1.4554271 18.873168 2.0858405 18.99784 2.546875 18.833984 C 2.7316813 18.769352 2.8798841 18.661846 2.9804688 18.517578 C 3.3404608 17.985454 2.9965753 17.123927 2.2128906 16.59375 C 1.8210482 16.328648 1.3942742 16.196631 1.0195312 16.197266 z "}]]
[:span {:class "count reply-count"} "REPLIES_COUNT"]]
[:button
{:class "footer-button retoots"}
[:svg
{:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 15.292642", :fill "currentColor"}
[:path
{:d
"M 5.5533678,0 C 3.6714839,2.400492 1.6157603,5.1817846 0,7.362011 c 1.4380083,0 2.4385201,-5.881e-4 3.6172864,0.024507 v 3.36241 c 0,2.591649 -0.00735,3.641069 -0.00735,4.541214 0.9377142,0 1.8786511,0.0025 4.6000315,0.0025 h 9.6117861 c -0.967065,-1.240489 -1.863419,-2.423552 -2.791388,-3.644245 -2.391113,-0.01058 -5.4310727,0 -7.7149168,0 0,-1.389694 0.00491,-2.9515088 0.00491,-4.2863375 H 10.998903 C 9.4664195,5.0599896 7.0361202,1.897534 5.5533678,0 Z m 0.6249377,0 c 0.9523292,1.225788 1.9124438,2.5142572 2.7766839,3.6368923 2.3911146,0.010578 5.4433266,0.00491 7.7271706,0.00491 0,1.3896944 -0.0025,2.9515086 -0.0025,4.2863373 h -3.678556 c 1.532486,2.3020214 3.962784,5.4669284 5.445536,7.3644624 1.881875,-2.400496 3.9376,-5.18424 5.55336,-7.3644663 -1.438009,0 -2.440971,5.881e-4 -3.619738,-0.024507 V 4.5412139 c 0,-2.5916487 0.0098,-3.64106836 0.0098,-4.5412139 -0.937714,0 -1.881102,0 -4.602482,0 z"}]]
[:span {:class "count retoot-count"} "REBLOGS_COUNT"]]
[:button
{:class "footer-button likes"}
[:svg
{:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 22.799999", :fill "currentColor"}
[:path
{:d
"M 12,18.324 19.416,22.8 17.448,14.364 24,8.688 15.372,7.956 12,0 8.628,7.956 0,8.688 6.552,14.364 4.584,22.8 Z"}]]
[:span {:class "count like-count"} "FAVOURITES_COUNT"]]]]]]])

View file

@ -1,90 +0,0 @@
; Licensed to the Apache Software Foundation (ASF) under one
; or more contributor license agreements. See the NOTICE file
; distributed with this work for additional information
; regarding copyright ownership. The ASF licenses this file
; to you under the Apache License, Version 2.0 (the
; "License"); you may not use this file except in compliance
; with the License. You may obtain a copy of the License at
;
; http://www.apache.org/licenses/LICENSE-2.0
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.
(ns dda.masto-embed.to-html-test
(:require
[cljs.test :refer (deftest is)]
[dda.masto-embed.to-html :as sut]
[dda.masto-embed.data-helpers :as dh]
[hickory.core :as h]
[hickory.convert :as hc]
[shadow.resource :as rc]))
(def media_attachments
[{:description "Plastikmüll gesammelt",
:meta
{:original
{:width 1500, :height 2000, :size "1500x2000", :aspect 0.75},
:small
{:width 416,
:height 554,
:size "416x554",
:aspect 0.7509025270758123}},
:type "image",
:blurhash "UAFiMmx^9aE1yEjEM|%N0eD%w]t7D$%NR4tR",
:preview_url
"https://cdn.masto.host/socialmeissagmbhde/media_attachments/files/112/432/505/467/393/505/small/0d01ddb07440328e.jpg",
:preview_remote_url nil,
:id "112432505467393505",
:url
"https://cdn.masto.host/socialmeissagmbhde/media_attachments/files/112/432/505/467/393/505/original/0d01ddb07440328e.jpg",
:remote_url nil,
:text_url nil}])
(def link_prev
{:description "forgejo - Beyond coding. We forge.",
:author_url "",
:image_description "",
:width 290,
:type "link",
:embed_url "",
:blurhash "URC3:FsU1xJS-8NvJ9$OFIS3wexEJ9n*xEbG",
:title
"forgejo/tests/integration/api_activitypub_repository_test.go at fe3473fc8b7b51e024b1a564fc7f01e385ebfb5e",
:published_at nil,
:provider_name "Codeberg.org",
:language "en",
:url
"https://codeberg.org//forgejo/forgejo/src/commit/fe3473fc8b7b51e024b1a564fc7f01e385ebfb5e/tests/integration/api_activitypub_repository_test.go",
:author_name "",
:image
"https://cdn.masto.host/socialmeissagmbhde/cache/preview_cards/images/000/545/643/original/199336f5aa5b9683.png",
:provider_url "",
:height 290,
:html ""})
; TODO: Replace this test
;(deftest test-mastodon->html
; (is (= [:ul {:class "list-group"}
; '([:li {:class "list-group-item, card"}
; [:div {:class "card-body"}
; [:h2 {:class "card-title"} [:a {:href "https://social.meissa-gmbh.de/users/team/statuses/104183256213204298/activity"} "2020-05-17" " " "10:12:10"]]
; [:p {:class "card-text"} "<p>We&apos;ve a new asciicast ... </p>"
; nil]]])]
; (sut/masto->html statuses))))
(deftest test-masto-media->html
(is (= dh/post-with-img
(sut/masto-media->html dh/post-base-img media_attachments))))
(deftest test-insert-link-prev
(is (= dh/post-with-prev
(sut/insert-link-prev dh/post-base-prev))))
(deftest test-masto-link-prev->html
(is (= dh/filled-post-with-prev
(sut/masto-link-prev->html dh/post-base-prev link_prev))))