Skip to content

Commit

Permalink
refine editorial approach
Browse files Browse the repository at this point in the history
moving away from statement tagging since we're about considering a series of statements over time, not in isolation.. and tagging individual statements doesn't work well with considering the bigger picture
  • Loading branch information
sterlingwes committed Feb 3, 2024
1 parent dcc4c81 commit 99bad84
Show file tree
Hide file tree
Showing 9 changed files with 165 additions and 100 deletions.
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@
"gen-schemas": "bun run scripts/zod-json-schema.ts",
"schemas": "bun run ajv validate -s site/src/schemas/enabler -d \"site/src/content/enabler/*.json\"",
"astro": "cd site && bun run astro",
"check": "cd site && bun run astro check"
"check": "cd site && bun run astro check",
"fc": "bun run check && bun run types && bun run schemas && bun run test"
},
"devDependencies": {
"@types/bun": "latest"
Expand Down
4 changes: 2 additions & 2 deletions site/src/layouts/ContentPageLayout.astro
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ const pageTitle = homePage ? title : `${basePageTitle} • ${title}`;
)
}
<div class="content">
<h1>{title}</h1>
<h1 class="page-title">{title}</h1>
<slot />
</div>
</main>
Expand Down Expand Up @@ -80,7 +80,7 @@ const pageTitle = homePage ? title : `${basePageTitle} • ${title}`;
z-index: 1;
color: rgba(255, 255, 255, 80%);
}
h1,
h1.page-title,
.logo {
font-family: "PTSerif";
font-size: 3rem;
Expand Down
9 changes: 0 additions & 9 deletions site/src/lib/constants/editorial-tags.ts

This file was deleted.

13 changes: 1 addition & 12 deletions site/src/lib/constants/strings.json
Original file line number Diff line number Diff line change
@@ -1,16 +1,5 @@
{
"mission_statement": "This website seeks to collect public statements from those supporting Israel's mass displacement, starvation, and murder of Palestinians, and to contrast their statements with the human toll of Israel's campaign.",
"mission_statement": "Genocide.club seeks to archive public statements from those supporting Israel's mass displacement, starvation, and murder of Palestinians, and to contrast their statements with the human toll of Israel's campaign.",
"mission_short": "We collect the public statements from those supporting Israel's mass displacement, starvation, and murder of Palestinians, and put them in context.",
"editorial_intro": "In the process of collecting statements for an individual or group, we determine whether one or more of the following categories applies to their statement. If a category applies, that statement is a candidate for inclusion.",
"tag_denial_head": "Denial",
"tag_denial_para": "Denial doesn't have to be explicit. It can also be implicit through obfuscation or intentional omission. This can also appear as willful ignorance. This negative form of denial is hard to prove in isolation given it won't be clearly stated. A series of statements taken together over time, however, can signal an intentional act of omission. This has been a very common tool of those trying to shape the narrative to fit Israel's strategy in Gaza. Often this is exhibited when nearly all of a person's statements omit any reference to the Palestinian perspective or the impact of Israel's actions on that population. These statements can seem detached from reality. We'll include statements from individuals who have taken a clear stance in support of Israel's actions while exhibiting denial of the impact or potential illegality of those actions. Taken together, such statements imply an acceptance of those actions and their impacts. We'll typically include a sampling of these statements to demonstrate the concerted effort over time and to contrast that trend with the human toll of Israel's acts.",
"tag_discrimination_head": "Discrimination",
"tag_discrimination_para": "Discrimination often comes in the form of xenophobia or racism. Islamophobia is closely related. A common example of this in recent days is claiming pro-Palestinian protests or vigils are \"hateful\", or associating the attendees of a gathering as supporters of Hamas or Iran without merit. We may also categorize statements that make accusations of antisemitism as discriminatory if they are unfounded (according to the framework defined by the Jerusalem Declaration on Antisemitism, 2020) and there's reasonable grounds to believe the accuser did so in a discriminatory way.",
"tag_dehumanisation_head": "Dehumanisation",
"tag_dehumanisation_para": "This category is perhaps the most insidious, as it involves broad generalisations about a group of people that take away their individual humanity. The common claim of \"human shields\" is one. Israeli Defence Minister Yoav Gallant's statement that Gazans are \"human animals\" is another very clear example.",
"tag_incitement_head": "Incitement",
"tag_incitement_para": "This class of statements are hard to miss given the aggressive nature. This can include calling for violence against people or the persecution of a group.",
"tag_classification_head": "Classification",
"tag_classification_para": "Classification is an effort to divide people into groups (\"us\" vs \"them\") based on perceived differences or stereotypes. This can be used to stoke fear or create the appearance of a lack of common humanity. Employing classification often means using carefully crafted narratives that twist reality. This commonly manifests as overly biased or caricatured statements, or outright boosting of government or military propaganda.",
"contact": "You can contact us at [email protected]."
}
28 changes: 2 additions & 26 deletions site/src/pages/[...enablerPage].astro
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import { getEnhancedPosts } from "../lib/server/posts";
import OverlayScreenModal from "../components/OverlayScreenModal.astro";
import ContentBox from "../components/ContentBox.astro";
import { getStrings } from "../lib/constants/strings";
import type { EditorialTags } from "../lib/constants/editorial-tags";
import { properCase, getPossessivePronoun } from "../lib/formatting";
export async function getStaticPaths() {
Expand All @@ -31,15 +30,6 @@ interface Props {
const { enabler } = Astro.props;
const posts = getEnhancedPosts(enabler.posts);
const tagCounts: Record<string, number> = {};
posts.forEach(({ tags }) =>
tags.forEach((tag) => {
tagCounts[tag] = (tagCounts[tag] ?? 0) + 1;
})
);
const tagOrder = Object.keys(tagCounts).sort(
(a, b) => tagCounts[b] - tagCounts[a]
);
const svgDomain = getSvgDomain();
const {
Expand Down Expand Up @@ -241,22 +231,8 @@ const enablerAboutMessage = `${enabler.name} is a member of the genocide club du
{enablerAboutMessage}
</p>
<p>
{properCase(getPossessivePronoun(enabler.gender))} statements were assigned
the following qualifying categories which you can read more about in <a
href="/docs/editorial">our editorial guide</a
>:
<ul>
{
tagOrder.map((tag) => (
<li>
<StructuredText
parts={getStrings(`tag_${tag as EditorialTags[0]}_head`)}
/>
({tagCounts[tag]})
</li>
))
}
</ul>
{properCase(getPossessivePronoun(enabler.gender))} statements qualified for
inclusion based on <a href="/docs/editorial">our editorial guide</a>
</p>
</ContentBox>
</OverlayScreenModal>
Expand Down
194 changes: 155 additions & 39 deletions site/src/pages/docs/editorial.astro
Original file line number Diff line number Diff line change
@@ -1,24 +1,6 @@
---
import ContentBox from "../../components/ContentBox.astro";
import ContentPageLayout from "../../layouts/ContentPageLayout.astro";
import StructuredText from "../../components/StructuredText.astro";
import { editorialTags } from "../../lib/constants/editorial-tags";
import { getStrings } from "../../lib/constants/strings";
import { getCollection } from "astro:content";
const enablers = await getCollection("enabler");
const tagCountLookup: Record<string, number> = {};
enablers.forEach(({ data: { posts } }) =>
posts.forEach(({ tags }) =>
tags.forEach((tag) => {
tagCountLookup[tag] = (tagCountLookup[tag] ?? 0) + 1;
})
)
);
const tagOrder = editorialTags.sort((a, b) => {
return (tagCountLookup[b] ?? 0) - (tagCountLookup[a] ?? 0);
});
---

<ContentPageLayout
Expand All @@ -27,36 +9,170 @@ const tagOrder = editorialTags.sort((a, b) => {
>
<ContentBox>
<p>
<StructuredText parts={getStrings("editorial_intro")} />
</p>
<p>
For our classification approach, we've taken some guidance from the work
of Dr. Gregory H Stanton. You can read the Holocaust Memorial Day Trust's <a
href="https://www.hmd.org.uk/learn-about-the-holocaust-and-genocides/what-is-genocide/the-ten-stages-of-genocide/"
target="_blank">Summary of the Ten Stages of Genocide</a
> to learn more.
</p>
{
tagOrder.map((tag) => (
<>
<h2>
<StructuredText parts={getStrings(`tag_${tag}_head`)} />
</h2>
<p>
<StructuredText parts={getStrings(`tag_${tag}_para`)} />
</p>
</>
))
}
This document looks to both provide insight into what we look for and a
template for our editors to reference when archiving.
</p>
<h2>Historical Lessons</h2>
<p>
The Holocaust - the worst genocide in history - is one of the most
well-studied events in modern times. Looking back to the period of time
leading up to the Holocaust and its early days, we have a prototype for
understanding what's happening now in Gaza. We can look to the types of
individuals that were involved in enabling it to happen and likewise
understand who has a hand in the unfolding events in Gaza today.
</p>
<h2>Classifying the Enablers</h2>
<p>
Individuals or groups on genocide.club will fall into one of the following
categories.
</p>
<h3>Perpetrators</h3>
<p>
Those directly involved in planning, executing, or facilitating genocide.
This includes high-ranking government officials, military officers, and
others who actively participate in the planning and execution of attacks
on, or deprivation of, civilians and their critical infrastructure.
</p>
<h3>Collaborators</h3>
<p>
Individuals or groups who, while not part of an official regime or agency,
actively collaborated with the perpetrators. This could include local
authorities, police, and certain political or societal groups that
assisted in the persecution of civilians.
</p>
<h3>Bystanders</h3>
<p>
Those who were aware of the atrocities but did not actively participate.
Bystanders may have witnessed or heard about the persecution, but either
chose not to intervene or were unable to do so due to fear or other
constraints. Those who were aware of the events but remained passive or
indifferent. This category includes people who may not have actively
supported the genocide but did little or nothing to resist or oppose it.
</p>
<h3>Beneficiaries</h3>
<p>
Individuals or groups who benefited from the persecution and exploitation
of those targeted for murder or displacement. This could include people
who seized property, businesses, or wealth confiscated from victims.
</p>
<h2>Our Premise</h2>
<p>
It's important to acknowledge that by doing this archiving work, we're
accepting the opinion of a number of academics and scholars on the subject
of genocide who have said they believe Israel's actions qualify. We also
note the interim ruling by the International Court of Justice that
Israel's actions to date make a plausible case for genocide.
</p>
<h2>Subject Inclusion Guide</h2>
<p>At a high level, we aim to include individuals or groups that:</p>
<ul>
<li>are of influence; and</li>
<li>
have made unqualified statements of support or encouragement of Israel's
actions against Palestinians
</li>
</ul>
<h3>Person of influence</h3>
<p>
The person or group holds a position with influence over a population and
can sway opinion or influence policy or shape acceptable discourse.
Typical candidates that meet this criteria are:
</p>
<ul>
<li>Active politicians or past heads of state</li>
<li>Industry or corporate leaders</li>
<li>Prominent media figures or pundits</li>
<li>Military or other state officials</li>
</ul>
<h3>Unqualified statements of support or encouragement</h3>
<p>
If the person or group has made consistent statements in support of
Israel's actions in Gaza without calling into question the methods being
used, their impacts on civilians, or incitement by Israeli officials,
they're - at best - a willing bystander to an unfolding genocide.
</p>
<h2>Statement Inclusion Guide</h2>
<p>
To support our subject's inclusion on genocide.club under one of the
primary categories above, we include statements they've made in a
timeline. Those statements will generally fit one or more of the following
categories:
</p>
<ul class="statement-list">
<li>
<strong>Dehumanization</strong> - any statement that dehumanizes Palestinians
or their supporters, portraying them as less worthy of equal treatment, subhuman,
threatening, or evil. By reducing the humanity of the victims, it becomes
easier for the perpetrators and their supporters to justify acts of violence
and cruelty.
</li>
<li>
<strong>Creating a False Narrative</strong> - any statement that distorts
or revises historical facts, manipulates information, or creates a false
narrative that justifies the persecution of Palestinians or their supporters.
This false narrative can be used to legitimize discriminatory policies and
violent actions.
</li>
<li>
<strong>Fostering Fear and Paranoia</strong> - statements can instill fear
and paranoia among the population, making them more susceptible to accepting
extreme measures against Palestinians or their supporters. It may exaggerate
threats, real or imagined, posed by Palestinians or their supporters to manipulate
public sentiment.
</li>
<li>
<strong>Building Support for Persecution</strong> - any statement that aims
to garner support for discriminatory laws, policies, or actions against Palestinians.
It often exploits existing prejudices and fears, turning them into widespread
public sentiment in favor of harsh measures.
</li>
<li>
<strong>Creating a Sense of National Crisis</strong> - any statement that
may portray Palestinians or their supporters as a threat to a nation, creating
a false sense of crisis that requires drastic measures for the preservation
of a state and its people. This narrative can be used to justify extreme
actions, including genocide in the case of Palestinians, or heavy-handed
police action in the case of supporters abroad.
</li>
<li>
<strong>Promoting Solidarity with the IDF or Israeli Government</strong>
- statements that foster a sense of unity among the perpetrators and their
supporters, creating an "us versus them" mentality. This sense of solidarity
can lead to the dehumanization and scapegoating of Palestinians, making it
easier to commit atrocities.
</li>
<li>
<strong>Normalizing Violence</strong> - statements that normalize violence
against Palestinians by portraying such actions as necessary for the greater
good, national security, or the preservation of a particular ideology. This
normalization desensitizes people to the brutality of genocide.
</li>
</ul>
<p>
It's important to note that it's the collective impact of these statements
over time that need to be considered in determining whether an individual
or group should be included. In some cases what's left unsaid is just as
important as an explicit statement.
</p>
</ContentBox>
</ContentPageLayout>

<style>
h2:first-of-type {
margin-top: 0;
}
p {
margin: 0;
margin-bottom: 2rem;
}
p:last-of-type {
margin-bottom: 0;
}
ul.statement-list {
padding-left: 20px;

li {
margin-bottom: 20px;
}
}
</style>
2 changes: 1 addition & 1 deletion site/src/pages/index.astro
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ const enablers = await getCollection("enabler");
</p>
<p>
You can <a href="/docs/editorial">read our editorial guide</a> to learn more
about how we decide who and what gets included in the club.
about how we decide who and what gets included here.
</p>
<ul>
{
Expand Down
9 changes: 1 addition & 8 deletions site/src/schemas/enabler.json
Original file line number Diff line number Diff line change
Expand Up @@ -67,14 +67,7 @@
"tags": {
"type": "array",
"items": {
"type": "string",
"enum": [
"dehumanisation",
"discrimination",
"incitement",
"classification",
"denial"
]
"type": "string"
}
},
"quote": {
Expand Down
3 changes: 1 addition & 2 deletions site/src/schemas/enabler.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { z } from "zod";
import { editorialTags } from "../lib/constants/editorial-tags";

/**
* run "bun run gen-schemas" to update the matching JSON schema if changed
Expand All @@ -22,7 +21,7 @@ export const schema = z.object({
image: z.string().optional(),
imageCaption: z.string().optional(),
commentary: z.string().optional(),
tags: z.array(z.enum(editorialTags as [string, ...string[]])),
tags: z.array(z.string()),
quote: z
.object({
text: z.string(),
Expand Down

0 comments on commit 99bad84

Please sign in to comment.