mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2025-10-28 20:02:24 -05:00
This pull request closes https://codeberg.org/superseriousbusiness/gotosocial/issues/3403 by searching for alt or title attributes in HTML, looking for the shortest indent (if any) at the start of multiline content of said attributes, and remove that shortest indent from each line. This is a bit more fiddly than the "easy" way of doing it, but it has the advantage that it preserves user-added indents at the start of lines of alt text. Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4149 Co-authored-by: tobi <tobi.smethurst@protonmail.com> Co-committed-by: tobi <tobi.smethurst@protonmail.com>
238 lines
11 KiB
Go
238 lines
11 KiB
Go
// GoToSocial
|
|
// Copyright (C) GoToSocial Authors admin@gotosocial.org
|
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Affero General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU Affero General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Affero General Public License
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
package router
|
|
|
|
import (
|
|
"html/template"
|
|
"testing"
|
|
)
|
|
|
|
func TestOutdentPreformatted(t *testing.T) {
|
|
const html = template.HTML(`
|
|
<div class="text">
|
|
<div
|
|
class="content"
|
|
lang="en"
|
|
title="DW from Arthur is labeled "crawlers".
|
|
|
|
She's reading a sign on a door that says: "robots.txt: don't crawl this website, it's not for you, please, thanks."
|
|
|
|
With her hands on her hips looking annoyed she says "That sign won't stop me because I can't read!""
|
|
alt="pee pee poo poo"
|
|
>
|
|
<p>Here's a bunch of HTML, read it and weep, weep then!</p>
|
|
<pre><code class="language-html"><section class="about-user">
|
|
<div class="col-header">
|
|
<h2>About</h2>
|
|
</div>
|
|
<div class="fields">
|
|
<h3 class="sr-only">Fields</h3>
|
|
<dl>
|
|
<div class="field">
|
|
<dt>should you follow me?</dt>
|
|
<dd>maybe!</dd>
|
|
</div>
|
|
<div class="field">
|
|
<dt>age</dt>
|
|
<dd>120</dd>
|
|
</div>
|
|
</dl>
|
|
</div>
|
|
<div class="bio">
|
|
<h3 class="sr-only">Bio</h3>
|
|
<p>i post about things that concern me</p>
|
|
</div>
|
|
<div class="sr-only" role="group">
|
|
<h3 class="sr-only">Stats</h3>
|
|
<span>Joined in Jun, 2022.</span>
|
|
<span>8 posts.</span>
|
|
<span>Followed by 1.</span>
|
|
<span>Following 1.</span>
|
|
</div>
|
|
<div class="accountstats" aria-hidden="true">
|
|
<b>Joined</b><time datetime="2022-06-04T13:12:00.000Z">Jun, 2022</time>
|
|
<b>Posts</b><span>8</span>
|
|
<b>Followed by</b><span>1</span>
|
|
<b>Following</b><span>1</span>
|
|
</div>
|
|
</section>
|
|
</code></pre>
|
|
<p>There, hope you liked that!</p>
|
|
</div>
|
|
</div>
|
|
<div class="text">
|
|
<div
|
|
class="content"
|
|
lang="en"
|
|
alt="DW from Arthur is labeled "crawlers".
|
|
|
|
She's reading a sign on a door that says: "robots.txt: don't crawl this website, it's not for you, please, thanks."
|
|
|
|
With her hands on her hips looking annoyed she says "That sign won't stop me because I can't read!""
|
|
>
|
|
<p>Here's a bunch of HTML, read it and weep, weep then!</p>
|
|
<pre><code class="language-html"><section class="about-user">
|
|
<div class="col-header">
|
|
<h2>About</h2>
|
|
</div>
|
|
<div class="fields">
|
|
<h3 class="sr-only">Fields</h3>
|
|
<dl>
|
|
<div class="field">
|
|
<dt>should you follow me?</dt>
|
|
<dd>maybe!</dd>
|
|
</div>
|
|
<div class="field">
|
|
<dt>age</dt>
|
|
<dd>120</dd>
|
|
</div>
|
|
</dl>
|
|
</div>
|
|
<div class="bio">
|
|
<h3 class="sr-only">Bio</h3>
|
|
<p>i post about things that concern me</p>
|
|
</div>
|
|
<div class="sr-only" role="group">
|
|
<h3 class="sr-only">Stats</h3>
|
|
<span>Joined in Jun, 2022.</span>
|
|
<span>8 posts.</span>
|
|
<span>Followed by 1.</span>
|
|
<span>Following 1.</span>
|
|
</div>
|
|
<div class="accountstats" aria-hidden="true">
|
|
<b>Joined</b><time datetime="2022-06-04T13:12:00.000Z">Jun, 2022</time>
|
|
<b>Posts</b><span>8</span>
|
|
<b>Followed by</b><span>1</span>
|
|
<b>Following</b><span>1</span>
|
|
</div>
|
|
</section>
|
|
</code></pre>
|
|
<p>There, hope you liked that!</p>
|
|
</div>
|
|
</div>
|
|
`)
|
|
|
|
const expected = template.HTML(`
|
|
<div class="text">
|
|
<div
|
|
class="content"
|
|
lang="en"
|
|
title="DW from Arthur is labeled "crawlers".
|
|
|
|
She's reading a sign on a door that says: "robots.txt: don't crawl this website, it's not for you, please, thanks."
|
|
|
|
With her hands on her hips looking annoyed she says "That sign won't stop me because I can't read!""
|
|
alt="pee pee poo poo"
|
|
>
|
|
<p>Here's a bunch of HTML, read it and weep, weep then!</p>
|
|
<pre><code class="language-html"><section class="about-user">
|
|
<div class="col-header">
|
|
<h2>About</h2>
|
|
</div>
|
|
<div class="fields">
|
|
<h3 class="sr-only">Fields</h3>
|
|
<dl>
|
|
<div class="field">
|
|
<dt>should you follow me?</dt>
|
|
<dd>maybe!</dd>
|
|
</div>
|
|
<div class="field">
|
|
<dt>age</dt>
|
|
<dd>120</dd>
|
|
</div>
|
|
</dl>
|
|
</div>
|
|
<div class="bio">
|
|
<h3 class="sr-only">Bio</h3>
|
|
<p>i post about things that concern me</p>
|
|
</div>
|
|
<div class="sr-only" role="group">
|
|
<h3 class="sr-only">Stats</h3>
|
|
<span>Joined in Jun, 2022.</span>
|
|
<span>8 posts.</span>
|
|
<span>Followed by 1.</span>
|
|
<span>Following 1.</span>
|
|
</div>
|
|
<div class="accountstats" aria-hidden="true">
|
|
<b>Joined</b><time datetime="2022-06-04T13:12:00.000Z">Jun, 2022</time>
|
|
<b>Posts</b><span>8</span>
|
|
<b>Followed by</b><span>1</span>
|
|
<b>Following</b><span>1</span>
|
|
</div>
|
|
</section>
|
|
</code></pre>
|
|
<p>There, hope you liked that!</p>
|
|
</div>
|
|
</div>
|
|
<div class="text">
|
|
<div
|
|
class="content"
|
|
lang="en"
|
|
alt="DW from Arthur is labeled "crawlers".
|
|
|
|
She's reading a sign on a door that says: "robots.txt: don't crawl this website, it's not for you, please, thanks."
|
|
|
|
With her hands on her hips looking annoyed she says "That sign won't stop me because I can't read!""
|
|
>
|
|
<p>Here's a bunch of HTML, read it and weep, weep then!</p>
|
|
<pre><code class="language-html"><section class="about-user">
|
|
<div class="col-header">
|
|
<h2>About</h2>
|
|
</div>
|
|
<div class="fields">
|
|
<h3 class="sr-only">Fields</h3>
|
|
<dl>
|
|
<div class="field">
|
|
<dt>should you follow me?</dt>
|
|
<dd>maybe!</dd>
|
|
</div>
|
|
<div class="field">
|
|
<dt>age</dt>
|
|
<dd>120</dd>
|
|
</div>
|
|
</dl>
|
|
</div>
|
|
<div class="bio">
|
|
<h3 class="sr-only">Bio</h3>
|
|
<p>i post about things that concern me</p>
|
|
</div>
|
|
<div class="sr-only" role="group">
|
|
<h3 class="sr-only">Stats</h3>
|
|
<span>Joined in Jun, 2022.</span>
|
|
<span>8 posts.</span>
|
|
<span>Followed by 1.</span>
|
|
<span>Following 1.</span>
|
|
</div>
|
|
<div class="accountstats" aria-hidden="true">
|
|
<b>Joined</b><time datetime="2022-06-04T13:12:00.000Z">Jun, 2022</time>
|
|
<b>Posts</b><span>8</span>
|
|
<b>Followed by</b><span>1</span>
|
|
<b>Following</b><span>1</span>
|
|
</div>
|
|
</section>
|
|
</code></pre>
|
|
<p>There, hope you liked that!</p>
|
|
</div>
|
|
</div>
|
|
`)
|
|
|
|
out := outdentPreformatted(html)
|
|
if out != expected {
|
|
t.Fatalf("unexpected output:\n`%s`\n", out)
|
|
}
|
|
}
|