Compare commits
202 commits
shadow-clj
...
master
Author | SHA1 | Date | |
---|---|---|---|
a24ee62d16 | |||
f0aa2633a7 | |||
93aae1f7d6 | |||
795d5397e7 | |||
4a83bee3fc | |||
e681d7be23 | |||
e14c07204a | |||
979f6a3a80 | |||
0fa7a15296 | |||
257adb6bb5 | |||
8b509e9f8c | |||
176b919edf | |||
39333ea4fe | |||
f79529e0ea | |||
2a8171b9bb | |||
a91003568f | |||
99323a05ef | |||
47126a7b75 | |||
fd72cdecfa | |||
4b52c1214a | |||
8bb9e6c0f8 | |||
9f253e4401 | |||
643541f798 | |||
14f66cb2e1 | |||
ec9e4ae300 | |||
ff49e13b86 | |||
773ecc1820 | |||
|
0f330ca3c7 | ||
|
1cde7289c5 | ||
0b85045158 | |||
524ee19dc8 | |||
|
6a637dc2cf | ||
8f02c0124f | |||
|
a7ac9fab94 | ||
8d41a8236d | |||
1e1eb7786e | |||
daf9149b04 | |||
142b74cd9b | |||
6a7e7deac6 | |||
73943a9af9 | |||
9ef30bd5a2 | |||
bc604143b1 | |||
6bcbfa4da6 | |||
b16e3ea61f | |||
1fe7b2ed78 | |||
|
e0a735e9bc | ||
430911272e | |||
a21ff9592d | |||
aa5afcd90f | |||
19e602bf9c | |||
644717d272 | |||
90ec08522d | |||
8422e3580a | |||
4fe4060a1f | |||
07c7caade1 | |||
1143ba78a4 | |||
4537956c41 | |||
4f8eeb3eea | |||
ad352eb7fb | |||
43a3cbe6af | |||
098403588f | |||
30f7ecd612 | |||
b0d0ba9bd7 | |||
ea01bfe676 | |||
eb78652718 | |||
02b6af0e91 | |||
a7ca30cf09 | |||
0ff6f40af8 | |||
051800a3d2 | |||
c78a4dfdbe | |||
0a83f43921 | |||
af4f94adfc | |||
dce3eb0bb9 | |||
2d0dcf60a3 | |||
a2265d6b42 | |||
52c4574a3b | |||
b8cbac40f6 | |||
6a99a4a9ea | |||
88aee64dad | |||
6c9372c80f | |||
b01bae1f93 | |||
92456c16bf | |||
a5f4be5dc2 | |||
ed7c2a1f5f | |||
afb4152500 | |||
e2f74a7109 | |||
e356bae922 | |||
d926031406 | |||
d35335c234 | |||
7c5bc8f412 | |||
efea7a59bf | |||
38291503a3 | |||
eb13c31062 | |||
0b0b387ec8 | |||
0e7a16f59b | |||
1821e2bf08 | |||
4114318ded | |||
9f75c9ed0d | |||
93b1faff6a | |||
9106a08e6b | |||
70002e018a | |||
45b06cfba6 | |||
f2dbb2cf49 | |||
557f9fb56f | |||
cff37e8dfd | |||
1f8610410d | |||
f4b4e69516 | |||
0376c46f7a | |||
683df41e2a | |||
e30b09484f | |||
668b5a77ae | |||
dbf2f71b9f | |||
eb9c1d11ab | |||
2b1b032039 | |||
4c494e7d33 | |||
bb5d0eab5f | |||
e6eef65e1b | |||
96de64e06e | |||
fce8227f66 | |||
a32e895f7a | |||
0475e3b986 | |||
4bde2412fe | |||
e678de8f4e | |||
fc45b37012 | |||
cb7ec39d76 | |||
2156a5db6f | |||
4c21e559b2 | |||
442050f366 | |||
b185ce058f | |||
160eacf313 | |||
44177d5c0b | |||
ec73ff83e3 | |||
0bed73f287 | |||
84da12fa64 | |||
|
14dd5afe87 | ||
|
6b8ca6d2ee | ||
631a647255 | |||
a1533bd452 | |||
c09524e1a8 | |||
bc5af89daa | |||
1cb2d824d0 | |||
|
770006b06f | ||
437033ef25 | |||
30e6e1a8e9 | |||
6a84df7c7e | |||
d8ac788a46 | |||
0b1e9773da | |||
5600150847 | |||
18fa365d9e | |||
94d2791c4a | |||
36e0df4812 | |||
e18d06fbe5 | |||
7450d1d314 | |||
d2d6e30a7f | |||
527e950b8d | |||
40c06ad226 | |||
985f13e661 | |||
c203f75c79 | |||
034467730f | |||
06f904c7ef | |||
5707750913 | |||
98c6814297 | |||
56f33f95cb | |||
1466c3123f | |||
431df76787 | |||
ed8f26ec50 | |||
91d08399d9 | |||
45c5b10d93 | |||
5f076fccc6 | |||
2420e136cc | |||
370d33d55d | |||
479bd2cdb3 | |||
6d2c096cc6 | |||
6f4161172a | |||
5934c595a0 | |||
018281c148 | |||
a3eac086b6 | |||
f92b652bf9 | |||
65a0f5cb00 | |||
821092744f | |||
b5c1a12e33 | |||
7775dc88f5 | |||
0cfdf7fc02 | |||
79f0a0e1ce | |||
503f9fccc2 | |||
ca16b645bb | |||
c28d74cc5b | |||
8c6bf43765 | |||
2f54b0fddd | |||
85ef9b8667 | |||
c4f62a9b4d | |||
a5dec35f9c | |||
08e69ef973 | |||
5fde78a343 | |||
de0c47124c | |||
41a1387bdb | |||
61746c417f | |||
73b739e594 | |||
f3c9b3bd99 | |||
fa50477c33 | |||
d9467f5f1d | |||
c7af7ed650 |
29 changed files with 2024 additions and 2432 deletions
9
.gitignore
vendored
9
.gitignore
vendored
|
@ -11,8 +11,17 @@ 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
|
||||
|
|
55
.gitlab-ci.yml
Normal file
55
.gitlab-ci.yml
Normal file
|
@ -0,0 +1,55 @@
|
|||
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
140
README.md
|
@ -1,20 +1,142 @@
|
|||
# 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)
|
||||
|
||||
# Setup
|
||||
[<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)
|
||||
|
||||
```
|
||||
npm install npx
|
||||
npm install shadow-cljs
|
||||
npm install source-map-support --save-dev
|
||||
npm install mastodon-api
|
||||
## 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>
|
||||
```
|
||||
|
||||
# Development
|
||||
Reference:
|
||||
|
||||
* `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>
|
||||
```
|
||||
shadow-cljs node-repl
|
||||
|
||||
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 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
Normal file
133
build.py
Normal file
|
@ -0,0 +1,133 @@
|
|||
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)
|
BIN
doc/masto-embed-example.png
Normal file
BIN
doc/masto-embed-example.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 116 KiB |
20
doc/media-reference.edn
Normal file
20
doc/media-reference.edn
Normal file
|
@ -0,0 +1,20 @@
|
|||
: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}],
|
88
doc/status-reference.edn
Normal file
88
doc/status-reference.edn
Normal file
|
@ -0,0 +1,88 @@
|
|||
{: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 & 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
2371
package-lock.json
generated
File diff suppressed because it is too large
Load diff
34
package.json
34
package.json
|
@ -1,12 +1,26 @@
|
|||
{
|
||||
"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"
|
||||
}
|
||||
"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"
|
||||
]
|
||||
}
|
|
@ -3,9 +3,18 @@
|
|||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>masto-embed</title>
|
||||
<link rel="stylesheet" href="post.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
<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>
|
||||
<script src="js/main.js"></script>
|
||||
</body>
|
||||
</html>
|
358
public/post.css
Normal file
358
public/post.css
Normal file
|
@ -0,0 +1,358 @@
|
|||
.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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,17 +1,23 @@
|
|||
;; shadow-cljs configuration
|
||||
{:source-paths
|
||||
["src/dev"
|
||||
"src/main"
|
||||
["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 "out/node-tests.js"
|
||||
:autorun true}
|
||||
:frontend
|
||||
{:target :browser
|
||||
:modules {:main {:init-fn dda.masto-embed.app/init}}}}}
|
||||
{: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 {}}}}
|
||||
|
|
61
src/main/dda/masto_embed/api.cljs
Normal file
61
src/main/dda/masto_embed/api.cljs
Normal file
|
@ -0,0 +1,61 @@
|
|||
; 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 {}))
|
|
@ -1,25 +1,28 @@
|
|||
; 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
|
||||
["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"))))
|
||||
[dda.masto-embed.browser :as b]
|
||||
[dda.masto-embed.modes :as m]))
|
||||
|
||||
(defn init []
|
||||
(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))
|
||||
(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))))
|
51
src/main/dda/masto_embed/browser.cljs
Normal file
51
src/main/dda/masto_embed/browser.cljs
Normal file
|
@ -0,0 +1,51 @@
|
|||
; 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)))
|
29
src/main/dda/masto_embed/infra.cljs
Normal file
29
src/main/dda/masto_embed/infra.cljs
Normal file
|
@ -0,0 +1,29 @@
|
|||
; 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)
|
99
src/main/dda/masto_embed/modes.cljs
Normal file
99
src/main/dda/masto_embed/modes.cljs
Normal file
|
@ -0,0 +1,99 @@
|
|||
; 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))))
|
1
src/main/dda/masto_embed/resources/image.html
Normal file
1
src/main/dda/masto_embed/resources/image.html
Normal file
|
@ -0,0 +1 @@
|
|||
<img class="mastodon-post-image" src="https://cdn.masto.host/socialmeissagmbhde/media_attachments/files/112/432/505/467/393/505/original/0d01ddb07440328e.jpg"></img>
|
1
src/main/dda/masto_embed/resources/link_prev.html
Normal file
1
src/main/dda/masto_embed/resources/link_prev.html
Normal file
|
@ -0,0 +1 @@
|
|||
<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>
|
1
src/main/dda/masto_embed/resources/post-min-base.html
Normal file
1
src/main/dda/masto_embed/resources/post-min-base.html
Normal file
|
@ -0,0 +1 @@
|
|||
<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>
|
|
@ -0,0 +1 @@
|
|||
<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>
|
1
src/main/dda/masto_embed/resources/post-min-img.html
Normal file
1
src/main/dda/masto_embed/resources/post-min-img.html
Normal file
|
@ -0,0 +1 @@
|
|||
<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>
|
1
src/main/dda/masto_embed/resources/post-min-prev.html
Normal file
1
src/main/dda/masto_embed/resources/post-min-prev.html
Normal file
|
@ -0,0 +1 @@
|
|||
<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>
|
358
src/main/dda/masto_embed/resources/post.css
Normal file
358
src/main/dda/masto_embed/resources/post.css
Normal file
|
@ -0,0 +1,358 @@
|
|||
.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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
29
src/main/dda/masto_embed/resources/post.html
Normal file
29
src/main/dda/masto_embed/resources/post.html
Normal file
|
@ -0,0 +1,29 @@
|
|||
<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>
|
112
src/main/dda/masto_embed/to_html.cljs
Normal file
112
src/main/dda/masto_embed/to_html.cljs
Normal file
|
@ -0,0 +1,112 @@
|
|||
; 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)))
|
|
@ -1,8 +0,0 @@
|
|||
(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))))
|
319
src/test/dda/masto_embed/data_helpers.cljs
Normal file
319
src/test/dda/masto_embed/data_helpers.cljs
Normal file
|
@ -0,0 +1,319 @@
|
|||
(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"]]]]]]])
|
90
src/test/dda/masto_embed/to_html_test.cljs
Normal file
90
src/test/dda/masto_embed/to_html_test.cljs
Normal file
|
@ -0,0 +1,90 @@
|
|||
; 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'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))))
|
||||
|
Loading…
Reference in a new issue