Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve the quality of the rendered diagrams #1999

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 12 additions & 6 deletions assets/diagrams/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,17 @@ https://www.diagrams.net/ is a great ([open source](https://github.com/jgraph/dr
tool for these sorts of things - include your `.drawio` file next to your diagram.

Suggested settings for diagrams.net:
* Export as PNG.
* 100% size.
* Export as WebP.
* 200% size.
* `20` for a border width.
* No transparent background, shadow, or grid.
* Include a copy of the diagram.
* Light appearance.
* No shadow, or grid.

To reference a diagram, use the absolute path when compiled. For example,
`![membership-flow-diagram](/diagrams/membership.png)`
To reference a diagram, use the `diagram` shortcode. For example:

```
{{% diagram name="membership" alt="Diagram presenting the possible membership state transitions" %}}
```

Where `name` is the file name without extension, and `alt` is a textual
replacement for the image, useful for accessibility.
Binary file removed assets/diagrams/membership.png
Binary file not shown.
Binary file added assets/diagrams/membership.webp
Binary file not shown.
Binary file removed assets/diagrams/threaded-dag-threads.png
Binary file not shown.
Binary file added assets/diagrams/threaded-dag-threads.webp
Binary file not shown.
Binary file removed assets/diagrams/threaded-dag.png
Binary file not shown.
Binary file added assets/diagrams/threaded-dag.webp
Binary file not shown.
1 change: 1 addition & 0 deletions changelogs/internal/newsfragments/1999.clarification
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Improve the quality of the rendered diagrams
2 changes: 1 addition & 1 deletion content/client-server-api/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -2572,7 +2572,7 @@ Note that this rule is only expected to work in room versions

The allowable state transitions of membership are:

![membership-flow-diagram](/diagrams/membership.png)
{{% diagram name="membership" alt="Diagram presenting the possible membership state transitions" %}}

{{% http-api spec="client-server" api="list_joined_rooms" %}}

Expand Down
4 changes: 2 additions & 2 deletions content/client-server-api/modules/receipts.md
Original file line number Diff line number Diff line change
Expand Up @@ -155,12 +155,12 @@ related to a thread root via non-thread relations.
The following is an example DAG for a room, with dotted lines showing event
relationships and solid lines showing topological ordering.

![threaded-dag](/diagrams/threaded-dag.png)
{{% diagram name="threaded-dag" alt="Diagram presenting a DAG with thread relationships as a single timeline" %}}

This DAG can be represented as 3 threaded timelines, with `A` and `B` being thread
roots:

![threaded-dag-threads](/diagrams/threaded-dag-threads.png)
{{% diagram name="threaded-dag-threads" alt="Diagram presenting a DAG with thread relationships as 3 related timelines" %}}

With this, we can demonstrate that:
* A threaded read receipt on `I` would mark `A`, `B`, and `I` as read.
Expand Down
53 changes: 53 additions & 0 deletions layouts/shortcodes/diagram.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
{{- /*

This template is used to render an image representing a diagram.

It takes the following parameters:

* `name` (required): the file name without extension.
* `alt` (required): a textual replacement for the image, useful for
accessibility.

Other requirements for diagrams:

* They must be located in `/assets/diagrams`.
* They must be WebP images, with a `.webp` file extension.
* They must be rendered at a 200% scale.

Differences with loading a diagram as a regular markdown image:

* The diagram is lazy-loaded, which should speed up the loading of the spec.
* The dimensions of the diagram are added to the HTML, allowing the browser
to pre-allocate space before it is loaded.
* The diagram supports devices with high pixel density screens and a WebP
image is generated for the default resolution.
* A PNG fallback image is generated, for maximum browser compatibility.

*/ -}}

{{- $name := .Params.name -}}
{{- $alt := .Params.alt -}}

{{- $path := printf "/diagrams/%s.webp" $name -}}

{{- with resources.Get $path -}}
{{- $highRes := . -}}

{{- /*
The high resolution image has a scale of 200% so we need to divide the
dimensions by 2 to get the real one.
*/ -}}
{{- $width := div $highRes.Width 2 | string -}}
{{- $height := div $highRes.Width 2 | string -}}

{{- /* Generate a low resolution WebP and a fallback PNG. */ -}}
{{- $lowRes := $highRes.Resize (printf "%sx webp drawing" $width) -}}
{{- $fallback := $highRes.Resize (printf "%sx png" $width) -}}

<picture>
<source srcset="{{ $lowRes.RelPermalink }}, {{ $highRes.RelPermalink }} 2x" type="image/webp" />
<img src="{{ $fallback.RelPermalink }}" alt="{{ $alt }}" width="{{ $width }}" height="{{ $height }}" loading="lazy" />
</picture>
{{- else -}}
{{- errorf "diagram %s not found" $path -}}
{{- end -}}