Changelog 2399d1e
did you know in culture
10 atlas entries written24 files of code, design or docs +907 −162 lines
Articles and atlas entries 10
- Barbara Wootton culture · added · 616 words
- Harry J. Anslinger culture · added · 777 words
- Jack Herer culture · added · 533 words
- Jacques-Joseph Moreau culture · added · 761 words
- José Mujica culture · added · 636 words
- Leonard Howell culture · added · 651 words
- Leopoldo Salazar Viniegra culture · added · 757 words
- Raphael Mechoulam culture · added · 660 words
- Robert Randall culture · added · 569 words
- William O'Shaughnessy culture · added · 665 words
Code, design and documents 24 files
docs/CULTURE.md +20 −6
@@ -9,5 +9,5 @@ Read it together with `docs/DATA-MAINTENANCE.md`. The rules there about sources, history entries apply here too. -## The five parts +## The four parts | Part | Address | What it holds | Made of | @@ -15,6 +15,5 @@ history entries apply here too. | Language | `/culture/language/` | Words for the plant, its products, its tools and the acts around it | `culture/language/*.md` | | Traditions | `/culture/traditions/` | Things a community does with cannabis, again and again | `culture/traditions/*.md` | -| History | `/culture/history/` | Attitudes, propaganda, counterculture, as they show in the record of laws | A hand-picked list of history entries, in `src/pages/culture/history.astro` | -| People | not open yet | Cultural icons, activists, historical figures | — | +| People | `/culture/people/` | People whose campaigns, faith, research or politics changed what the law did with cannabis | `culture/people/*.md` | | Stories | `/culture/stories/` | Personal experiences and ethnographic accounts, gathered from the public | The participatory project; nothing is collected yet | @@ -30,6 +29,6 @@ Ask what the subject is. | A place whose importance is a sustained cannabis-related social practice or community | Traditions | Pusher Street, Freak Street, the gatherings at Hôtel Pimodan | | One dated event: a law, ruling, report, arrest, a single demonstration | `changes.yaml` (the history), with an article in `articles/` if it deserves one | Jamaica's 2015 act, the first Global Marijuana March | -| What people thought of cannabis and its users at some time and place | A history entry, then a line in `/culture/history/` | the 1894 Hemp Drugs Commission | -| One person | People, when it opens. Until then, mention them in the entries they belong to | Leonard Howell, John Sinclair | +| What people thought of cannabis and its users at some time and place | A history entry | the 1894 Hemp Drugs Commission | +| One person whose work changed what the law did | People | Harry Anslinger, Leonard Howell, Raphael Mechoulam | | A first-hand account | Stories, when it opens | — | | A strain, brand, shop or product review | Nowhere | — | @@ -68,4 +67,19 @@ Not for Language: strain names, product names, and slang that has no history bey it". +## What People is about + +An entry is about a person because of what they did to, with or against the law on cannabis: +wrote it, enforced it, defied it, studied the plant it bans, or changed it. Fame alone is not a +reason. An entry answers: + +1. **What they did that touched the law,** with dates, and the history entries that record it. +2. **Why,** in their own words where a source gives them, and what their contemporaries said. +3. **What came of it:** the law, the ruling, the discovery, the movement, and how it is judged now. + Where a person's claims were wrong or their methods harmful, say so on the evidence. + +Give `life` ("1892–1975") and, in `origin`, what they were ("American narcotics official"). +`countries` are the countries where they worked. A portrait is the right picture here. Do not +write about private life beyond what explains the public work. + ## What Traditions is about @@ -180,5 +194,5 @@ The site turns that into a figure with the caption and credit underneath. Rules: - A picture must show the subject itself: the thing, the act, the place or the people. No - buildings of institutions, no generic leaves, no portraits of officials. + buildings of institutions, no generic leaves, no portraits of officials (except in People, where the person is the subject). - Prefer openly licensed or public-domain images when a good, relevant one is available. If no suitable open image is found, a well-sourced photograph or illustration may be used
source-archive.json +167 −15
Not shown: a picture, a generated file, or past the length shown per change.
src/assets/culture/barbara-wootton-1924.jpg +0 −0
Not shown: a picture, a generated file, or past the length shown per change.
src/assets/culture/jack-herer-1989.jpg +0 −0
Not shown: a picture, a generated file, or past the length shown per change.
src/assets/culture/leopoldo-salazar-viniegra.jpg +0 −0
Not shown: a picture, a generated file, or past the length shown per change.
src/assets/culture/oshaughnessy-gunjah-1839.jpg +0 −0
Not shown: a picture, a generated file, or past the length shown per change.
src/assets/culture/william-oshaughnessy-1837.jpg +0 −0
Not shown: a picture, a generated file, or past the length shown per change.
src/components/CountryArticle.astro +1 −1
@@ -151,5 +151,5 @@ const culture = sub ? [] : cultureOf(c); {SHOW_PRICES && !sub && <PricePanel id={c.id} />} {scored.length > 0 && <CountryChart history={scored} context={history.filter((ch) => !ch.score)} />} - {culture.length > 0 && <CultureList entries={culture} heading="Culture" more={["The atlas →", `${base}culture/`]} />} + {culture.length > 0 && <CultureList entries={culture} heading="Culture" more={["The atlas →", `${base}culture/`]} limit={6} />} </div>
src/components/CultureList.astro +20 −12
@@ -1,22 +1,30 @@ --- // A short list of atlas entries with their pictures: on a country page, a history entry and -// beside another atlas entry. `more` is the link in the heading, as [label, href]. +// beside another atlas entry. `more` is the link in the heading, as [label, href]. With `limit`, +// only that many are shown at first and the rest open from a "Show all" line. import { Image } from "astro:assets"; import { cultureSection } from "../lib/culture.js"; -const { entries, heading, more } = Astro.props; +const { entries, heading, more, limit } = Astro.props; +const first = limit && entries.length > limit + 1 ? entries.slice(0, limit) : entries; +const groups = [first, entries.slice(first.length)]; const base = import.meta.env.BASE_URL; --- <section class="c-culture"> <h2>{heading}{more && <a href={more[1]}>{more[0]}</a>}</h2> - <ul> - {entries.map((e) => ( - <li> - <a href={`${base}${e.url}`} title={e.summary}> - {e.image ? <Image src={e.image.src} alt="" width={104} height={104} fit="cover" /> : <span class="c-culture-none" aria-hidden="true">{e.title.slice(0, 1)}</span>} - <span><small>{cultureSection(e.section).name}</small><b>{e.title}{e.spelling && e.spelling[0].text.toLowerCase() !== e.title.toLowerCase() && <i> {e.spelling[0].text}</i>}</b></span> - </a> - </li> - ))} - </ul> + {groups.map((list, g) => list.length > 0 && (() => { + const rows = ( + <ul> + {list.map((e) => ( + <li> + <a href={`${base}${e.url}`} title={e.summary}> + {e.image ? <Image src={e.image.src} alt="" width={104} height={104} fit="cover" /> : <span class="c-culture-none" aria-hidden="true">{e.title.slice(0, 1)}</span>} + <span><small>{cultureSection(e.section).name}</small><b>{e.title}{e.spelling && e.spelling[0].text.toLowerCase() !== e.title.toLowerCase() && <i> {e.spelling[0].text}</i>}</b></span> + </a> + </li> + ))} + </ul> + ); + return g === 0 ? rows : <details class="c-culture-more"><summary>Show all {entries.length} →</summary>{rows}</details>; + })())} </section>
src/components/DidYouKnow.astro +10 −5
@@ -1,4 +1,4 @@ --- -// "Did you know?": curious cases from the scores, the country write-ups and the history, +// "Did you know?": curious cases from the scores, the country write-ups, the history and the atlas, // three at a time. Every case is in the HTML and its links work without JavaScript; the // script only decides which three are showing. Country links open the drawer on the home page. @@ -6,5 +6,8 @@ import { getFacts } from "../lib/facts.js"; const base = import.meta.env.BASE_URL; -const facts = getFacts(); +// `group` limits the cases to one source ("culture" on the Culture page); the link then opens +// that part of the full list. +const { group } = Astro.props; +const facts = getFacts().filter((f) => !group || f.group === group); const PER_PAGE = 3; --- @@ -13,5 +16,5 @@ const PER_PAGE = 3; <h2>Did you know?</h2> <div class="dyk-nav"> - <a class="dyk-all-link" href={`${base}did-you-know/`}>All {facts.length} →</a> + <a class="dyk-all-link" href={`${base}did-you-know/${group ? `#${group}` : ""}`}>All {facts.length} →</a> <span class="dyk-count" id="dykCount">1 / {Math.ceil(facts.length / PER_PAGE)}</span> <button type="button" id="dykPrev" aria-label="Previous three">←</button> @@ -26,7 +29,9 @@ const PER_PAGE = 3; {f.parts.map((part) => typeof part === "string" ? part : part.country ? <a href={`${base}country/${part.country.slug}/`} data-country={part.country.id}>{part.label}</a> - : <a href={`${base}history/${part.change.id}/`}>{part.label}</a>)} + : part.entry ? <a href={`${base}${part.entry.url}`}>{part.label}</a> + : part.entry ? <a href={`${base}${part.entry.url}`}>{part.label}</a> + : <a href={`${base}history/${part.change.id}/`}>{part.label}</a>)} </p> - {f.history && <a class="dyk-more" href={`${base}history/${f.history.id}/`}>The full story →</a>} + {f.culture ? <a class="dyk-more" href={`${base}${f.culture.url}`}>Read the entry →</a> : f.history && <a class="dyk-more" href={`${base}history/${f.history.id}/`}>The full story →</a>} </li> ))}
src/content.config.ts +3 −2
@@ -222,5 +222,6 @@ const culture = defineCollection({ title: z.string().min(1), summary: z.string().min(1), // one or two sentences, shown on cards and under the title - origin: z.string().min(1).optional(), // language: where the word comes from, in a few words + origin: z.string().min(1).optional(), // language: where the word comes from, in a few words; people: what they were + life: z.string().min(1).optional(), // people: the years of their life, "1892–1975" also: z.array(z.string().min(1)).optional(), // other spellings and related words // how the word is written where it is used: the spelling in its own script, the language, and @@ -232,5 +233,5 @@ const culture = defineCollection({ // other atlas entries to show beside this one, as "<section>/<slug>", closest first. // Links in the text and shared history entries add more on their own; see docs/CULTURE.md. - related: z.array(z.string().regex(/^(language|traditions)\/[a-z0-9-]+$/)).default([]), + related: z.array(z.string().regex(/^(language|traditions|people)\/[a-z0-9-]+$/)).default([]), image: picture(image).optional(), // the entry's rank among the most important of its part (1 = first); see docs/CULTURE.md.
src/layouts/Base.astro +1 −1
@@ -350,5 +350,5 @@ const schemas = jsonld ? [jsonld].flat() : []; if (/^country\/[a-z]{2}\/$/.test(p)) return ["country", p]; if (/^history\/[^/]+\/$/.test(p)) return ["history", p]; - if (/^culture\/(language|traditions)\/[^/]+\/$/.test(p)) return ["culture", p]; + if (/^culture\/(language|traditions|people)\/[^/]+\/$/.test(p)) return ["culture", p]; return null; }
src/lib/culture.js +3 −4
@@ -12,6 +12,5 @@ export const CULTURE_SECTIONS = [ { id: "language", name: "Language", short: "Words for the plant, where they come from and where they are said.", entries: true, one: "word", lede: "Bhang, charas, dagga, ganja, kif, 420: the words people have for the plant, where each comes from and where it is said.", intro: "A name for cannabis is rarely only a name. It says which part of the plant is meant, who brought it, and often what the people in charge thought of those who used it." }, { id: "traditions", name: "Traditions", short: "Rituals, customs and places shaped by cannabis.", entries: true, one: "tradition", lede: "Rituals, faiths, customs and gathering places, and what the law made of each.", intro: "Where cannabis belongs to a festival, a faith, a daily habit or a neighbourhood's social life, the law has had to decide what to do about it: write an exception, look away, or prosecute." }, - { id: "history", name: "History", short: "Attitudes, propaganda and counterculture in the record of laws.", lede: "Social attitudes, propaganda and counterculture: the places where the record of laws shows what people thought." }, - { id: "people", name: "People", short: "Icons, activists and historical figures.", soon: true, lede: "Cultural icons, activists and historical figures." }, + { id: "people", name: "People", short: "Who made the laws, who broke them, and who changed what was known.", entries: true, one: "person", lede: "Officials, preachers, scientists and presidents: the people whose work shaped what the law did with cannabis.", intro: "Laws have authors and opponents. These are people whose campaigns, faith, research or politics changed what was allowed, told from the record and tied to the laws they touched." }, { id: "stories", name: "Stories", short: "Experiences told by the people who live with these laws.", lede: "Personal experiences and ethnographic accounts, gathered from the people who live with these laws." }, ]; @@ -50,5 +49,5 @@ export const cultureEntries = (await getCollection("culture")) .sort((a, b) => (a.featured ?? Infinity) - (b.featured ?? Infinity) || a.title.localeCompare(b.title)); // and so must links from one entry to another -for (const e of cultureEntries) for (const [, path] of (e.entry.body ?? "").matchAll(/\]\(\/(culture\/(?:language|traditions)\/[^/)#]+)\/?[^)]*\)/g)) { +for (const e of cultureEntries) for (const [, path] of (e.entry.body ?? "").matchAll(/\]\(\/(culture\/(?:language|traditions|people)\/[^/)#]+)\/?[^)]*\)/g)) { if (!cultureEntries.some((x) => x.url === path + "/")) throw new Error(`culture/${e.entry.id}.md: the text links to /${path}/, which does not exist`); } @@ -57,5 +56,5 @@ for (const e of cultureEntries) for (const [, path] of (e.entry.body ?? "").matc // order; then those the text links to or that link here, those sharing history entries, and those // kept in two or more of the same countries. Weighed together, at most eight. -const links = (e) => [...(e.entry.body ?? "").matchAll(/\]\(\/culture\/((?:language|traditions)\/[^/)#]+)/g)].map((m) => m[1]); +const links = (e) => [...(e.entry.body ?? "").matchAll(/\]\(\/culture\/((?:language|traditions|people)\/[^/)#]+)/g)].map((m) => m[1]); for (const e of cultureEntries) { const named = e.related.map((id) => {
src/lib/facts.js +66 −31
@@ -1,11 +1,15 @@ // "Did you know?" on the home page: short curious cases, each linked into the site. -// Three groups: computed from the scores (so they stay true when the data changes), curated -// from the country write-ups, and drawn from the history in /changes.yaml. Keep the curated -// and history ones in step with the files they come from. +// Four groups: computed from the scores (so they stay true when the data changes), curated +// from the country write-ups, drawn from the history in /changes.yaml, and drawn from the +// cultural atlas in /culture. Keep the curated, history and culture ones in step with the files +// they come from. // // Links are written inline: [[DE|Germany]] opens a country, [[h:canada-ban-1923|banned it]] -// opens a history entry. `kicker` is the small label above the fact; `history` adds a -// "the full story" link to that entry. Unknown countries or entries stop the build. +// opens a history entry, [[c:language/bhang|bhang]] opens an atlas entry. A term that has an +// atlas entry is linked to it on its first use in a fact. `kicker` is the small label above the +// fact; `history` adds a "the full story" link to that entry and `culture` a "read the entry" +// link to an atlas entry. Unknown countries or entries stop the build. import { SEGMENTS, countries, changes, regions, segAvg, worldAvg } from "./countries.js"; +import { cultureEntries } from "./culture.js"; const seg = (id) => SEGMENTS.findIndex((s) => s.id === id); @@ -43,5 +47,5 @@ const curated = [ { kicker: "Germany", text: "In [[DE|Germany]] you may grow three plants and carry 25 g — but giving any of it to a friend, even for free, is still a crime. That is why it scores 1 out of 10 for sharing.", history: "germany-cannabis-act-2024" }, { kicker: "Singapore", text: "[[SG|Singapore]] prosecutes its citizens and permanent residents for using cannabis abroad, even in countries where it is legal, and can test them when they return." }, - { kicker: "Uruguay", text: "[[UY|Uruguay]] was [[h:uruguay-legalisation-2013|the first country to legalise]], in 2013. Buyers register with the state and are verified by fingerprint at the pharmacy; tourists are not allowed to buy." }, + { kicker: "Uruguay", text: "[[UY|Uruguay]] was [[h:uruguay-legalisation-2013|the first country to legalise]], in 2013, under [[c:people/jose-mujica|José Mujica]]. Buyers register with the state and are verified by fingerprint at the pharmacy; tourists are not allowed to buy." }, { kicker: "Japan", text: "Until December 2024, [[JP|Japan]] punished possessing cannabis but not using it. The law now [[h:japan-use-criminalised-2024|makes use itself a crime]], with up to seven years in prison for possession." }, { kicker: "North Korea", text: "[[KP|North Korea]] is often called a cannabis paradise online. Its penal code actually lists cannabis alongside cocaine and heroin; the myth probably comes from legal hemp and a rough local tobacco." }, @@ -51,20 +55,18 @@ const curated = [ { kicker: "Fiji", text: "[[FJ|Fiji]]'s Court of Appeal has told judges not to jail people for up to 100 g of cannabis: fines, community service or a warning instead." }, { kicker: "Nauru", text: "[[NR|Nauru]], population about 12,000, has the harshest rule in the Pacific islands: a mandatory minimum of 12 months in prison for possessing any illicit drug." }, - { kicker: "India", text: "In [[IN|India]] the flowers and resin are banned, but bhang, made from cannabis leaves, is legal and sold in government-licensed shops in several states." }, - { kicker: "Malta", text: "[[MT|Malta]] was [[h:malta-legalisation-2021|the first EU country to legalise]], in 2021 — but there are no shops, only non-profit associations capped at 500 members each." }, + { kicker: "India", text: "In [[IN|India]] the flowers and resin are banned, but [[c:language/bhang|bhang]], made from cannabis leaves, is legal and sold in government-licensed shops in several states." }, + { kicker: "Malta", text: "[[MT|Malta]] was [[h:malta-legalisation-2021|the first EU country to legalise]], in 2021 — but there are no shops, only [[c:traditions/cannabis-social-clubs|non-profit associations]] capped at 500 members each." }, ]; // Curious cases from the history. Each one restates its entry in /changes.yaml. const fromHistory = [ - { kicker: "500 BC · China", history: "china-jirzankal-study-2019", text: "The earliest clear evidence of people burning cannabis for its effect comes from 2,500-year-old braziers in a cemetery in the mountains of western [[CN|China]], where trafficking it can now bring the death penalty." }, { kicker: "1563 · England", history: "england-hemp-mandate-1563", text: "In 1563 Elizabeth I ordered every landowner with 60 acres or more in England to grow hemp, or pay a fine of five pounds. The navy needed rope. The same country, the [[GB|United Kingdom]], [[h:uk-ban-1928|banned cannabis]] in 1928." }, { kicker: "1787 · Madagascar", history: "madagascar-merina-ban-1787", text: "One of the earliest national bans on record is from [[MG|Madagascar]]: in 1787 King Andrianampoinimerina prohibited cannabis across the Merina kingdom, with death as the penalty." }, - { kicker: "1798 · India", history: "india-bhang-tax-1798", text: "In 1798 the British Parliament taxed bhang, ganja and charas in [[IN|India]], saying the aim was to reduce consumption. Attempts to make cannabis a crime in 1838, 1871 and 1877 were never enacted." }, - { kicker: "1800 · Egypt", history: "egypt-french-ban-1800", text: "In October 1800 the French army occupying [[EG|Egypt]] banned hashish, alarmed by its use among its own troops." }, + { kicker: "1798 · India", history: "india-bhang-tax-1798", text: "In 1798 the British Parliament taxed [[c:language/bhang|bhang]], [[c:language/ganja|ganja]] and [[c:language/charas|charas]] in [[IN|India]], saying the aim was to reduce consumption. Attempts to make cannabis a crime in 1838, 1871 and 1877 were never enacted." }, + { kicker: "1800 · Egypt", history: "egypt-french-ban-1800", text: "In October 1800 the French army occupying [[EG|Egypt]] banned [[c:traditions/hashish-in-egypt|hashish]], alarmed by its use among its own troops." }, { kicker: "1874 · Egypt", history: "egypt-import-tax-1874", text: "[[EG|Egypt]] forbade importing cannabis in [[h:egypt-first-ban-1868|1868]]. Six years later it put a tax on those same imports." }, { kicker: "1830 · Brazil", history: "brazil-rio-pango-ban-1830", text: "Rio de Janeiro's council banned cannabis in 1830. A seller paid a fine of 20 milreis; a slave or anyone else caught using it faced up to three days in prison. [[BR|Brazil]]'s other councils followed." }, - { kicker: "1881 · DR Congo", history: "dr-congo-bena-riamba-1881", text: "Nineteenth-century visitors recorded a cannabis-centred movement among the Bashilenge in today's [[CD|DR Congo]]. Its members called themselves Bena Riamba — ‘sons of hemp’ — and used a communal pipe for holidays, trade agreements and peace settlements." }, { kicker: "1894 · India", history: "india-hemp-drugs-commission-1894", text: "After hearing nearly 1,200 witnesses, the Indian Hemp Drugs Commission concluded in 1894 that moderate use does practically no harm and that a ban would be unjustified. [[IN|India]] taxed and licensed cannabis until 1985." }, - { kicker: "1915 · Trinidad", history: "trinidad-ganja-licensing-1915", text: "[[TT|Trinidad and Tobago]] set up licensed ganja sellers in 1915. Ten years later it [[h:trinidad-ganja-ordinance-1925|banned the plant outright]]." }, + { kicker: "1915 · Trinidad", history: "trinidad-ganja-licensing-1915", text: "[[TT|Trinidad and Tobago]] set up licensed [[c:language/ganja|ganja]] sellers in 1915. Ten years later it [[h:trinidad-ganja-ordinance-1925|banned the plant outright]]." }, { kicker: "1922 · Ten tons", history: "de-monfreid-ten-tons-1922", text: "In 1922 a French adventurer shipped ten tons of Indian cannabis out of Bombay, labelled as insecticide. British officials watched it for two years, from the Seychelles to Hamburg. When the bags were finally opened, they held fertiliser." }, { kicker: "1920 · United Kingdom", history: "uk-dangerous-drugs-act-1920", text: "When the [[GB|United Kingdom]] wrote its first Dangerous Drugs Act in 1920, cannabis was not left out on purpose: the committee never discussed it. Police asked for hashish to be added and were told there was no evidence that the habit was at all common." }, @@ -72,33 +74,31 @@ const fromHistory = [ { kicker: "1923 · Canada", history: "canada-ban-1923", text: `[[CA|Canada]]${countries[0].id === "CA" ? ", today's highest-scoring country," : ""} banned cannabis in 1923 without a word of debate in Parliament. Nobody has established why: there was almost no use, and the first seizure came nine years later.` }, { kicker: "1923 · South Africa", history: "south-africa-league-request-1923", text: `It was [[ZA|South Africa]] that asked the League of Nations in 1923 to treat cannabis like opium and cocaine. A century later it ranks #${byId("ZA")?.rank} in the world for cannabis freedom.` }, - { kicker: "1934 · China", history: "china-xinjiang-hashish-trade-ended-1934", text: "Until 1934 hashish was exported legally from Xinjiang in [[CN|China]] to British India, under a tariff." }, - { kicker: "1937 · Uruguay", history: "uruguay-narcotics-law-1937", text: "[[UY|Uruguay]] made hashish a state monopoly sold only by pharmacies in 1937. Eighty years later its pharmacies [[h:uruguay-pharmacy-sales-2017|started selling cannabis again]] — this time without a prescription." }, - { kicker: "1940 · Mexico", history: "mexico-brief-legalisation-1940", text: "For five months in 1940 [[MX|Mexico]] let doctors prescribe drugs to users through state dispensaries. The United States cut off its exports of medical narcotics, and Mexico [[h:mexico-regulation-suspended-1940|suspended the rule]]." }, + { kicker: "1934 · China", history: "china-xinjiang-hashish-trade-ended-1934", text: "Until 1934 [[c:language/hashish|hashish]] was exported legally from Xinjiang in [[CN|China]] to British India, under a tariff." }, + { kicker: "1937 · Uruguay", history: "uruguay-narcotics-law-1937", text: "[[UY|Uruguay]] made [[c:language/hashish|hashish]] a state monopoly sold only by pharmacies in 1937. Eighty years later its pharmacies [[h:uruguay-pharmacy-sales-2017|started selling cannabis again]] — this time without a prescription." }, + { kicker: "1940 · Mexico", history: "mexico-brief-legalisation-1940", text: "For five months in 1940 [[MX|Mexico]], following the ideas of the psychiatrist [[c:people/leopoldo-salazar-viniegra|Leopoldo Salazar Viniegra]], let doctors prescribe drugs to users through state dispensaries. The United States cut off its exports of medical narcotics, and Mexico [[h:mexico-regulation-suspended-1940|suspended the rule]]." }, { kicker: "1942 · United States", history: "us-hemp-for-victory-1942", text: "Five years after the [[h:us-marihuana-tax-act-1937|Marihuana Tax Act]], the government of the [[US|United States]] made a film called Hemp for Victory and asked farmers to grow it for the war. They planted about 400,000 acres." }, - { kicker: "1944 · United States", history: "us-la-guardia-report-1944", text: "A five-year study ordered by the mayor of New York found in 1944 that marijuana did not lead to addiction, crime or harder drugs. The federal narcotics bureau attacked it, and [[US|US]] law did not change." }, - { kicker: "1948 · Kiribati and Tuvalu", history: "gilbert-islands-dangerous-drugs-1948", text: "One British colonial ordinance banned ‘Indian hemp’, its resin and even its seeds across the Gilbert and Ellice Islands. Separate versions still govern [[KI|Kiribati]] and [[h:ellice-islands-dangerous-drugs-1948|Tuvalu]]." }, - { kicker: "1948 · Japan", history: "japan-cannabis-control-act-1948", text: "[[JP|Japan]]'s 1948 ban on cannabis did not punish using it, which shielded hemp farmers who might breathe in their crop. The country had about 25,000 hemp farms in 1950 and 37 in 2016." }, + { kicker: "1944 · United States", history: "us-la-guardia-report-1944", text: "A five-year study ordered by the mayor of New York found in 1944 that [[c:language/marijuana|marijuana]] did not lead to addiction, crime or harder drugs. [[c:people/harry-anslinger|The federal narcotics bureau]] attacked it, and [[US|US]] law did not change." }, + { kicker: "1948 · Kiribati and Tuvalu", history: "gilbert-islands-dangerous-drugs-1948", text: "One British colonial ordinance banned ‘[[c:language/indian-hemp|Indian hemp]]’, its resin and even its seeds across the Gilbert and Ellice Islands. Separate versions still govern [[KI|Kiribati]] and [[h:ellice-islands-dangerous-drugs-1948|Tuvalu]]." }, + { kicker: "1948 · Japan", history: "japan-cannabis-control-act-1948", text: "[[JP|Japan]]'s 1948 ban on cannabis did not punish using it, which shielded [[c:language/hemp|hemp]] farmers who might breathe in their crop. The country had about 25,000 hemp farms in 1950 and 37 in 2016." }, { kicker: "1953 · Netherlands", history: "netherlands-possession-ban-1953", text: "The [[NL|Netherlands]] only made possessing cannabis an offence in 1953 — just over twenty years before it [[h:netherlands-toleration-1976|became known for tolerating it]]." }, { kicker: "1954 · United States", history: "us-toklas-cookbook-1954", text: "Alice B. Toklas's 1954 cookbook contained a recipe for hashish fudge, \"easy to whip up on a rainy day\". It was cut from the first American edition." }, { kicker: "1961 · Sri Lanka", history: "sri-lanka-ayurveda-act-1961", text: "In [[LK|Sri Lanka]] the only people who may legally sell cannabis are Ayurvedic practitioners, and their only legal supplier is a state corporation that gets most of it from police seizures." }, - { kicker: "1964 · Israel", history: "israel-mechoulam-thc-1964", text: "The chemist who first isolated THC got his material from the police: 11 pounds of seized Lebanese hashish, which he carried to his laboratory in [[IL|Israel]] on a public bus." }, - { kicker: "1966 · Nigeria", history: "nigeria-indian-hemp-decree-1966", text: "[[NG|Nigeria]]'s 1966 Indian Hemp Decree set death or 21 years for growing cannabis and at least ten years for possessing it. The death penalty [[h:nigeria-death-penalty-removed-1975|was dropped in 1975]]." }, + { kicker: "1966 · Nigeria", history: "nigeria-indian-hemp-decree-1966", text: "[[NG|Nigeria]]'s 1966 [[c:language/indian-hemp|Indian Hemp]] Decree set death or 21 years for growing cannabis and at least ten years for possessing it. The death penalty [[h:nigeria-death-penalty-removed-1975|was dropped in 1975]]." }, { kicker: "1970 · France", history: "france-use-criminalised-1970", text: "Until the last day of 1970, [[FR|France]] punished drug use only when it happened in company. Using alone has been a crime ever since." }, { kicker: "1971 · Finland", history: "finland-use-criminalised-1972", text: "[[FI|Finland]] made using drugs a crime in itself after a vote of 92 to 80. In 2026 its parliament [[h:finland-legalisation-initiative-rejected-2026|rejected legalisation]] by 145 to 18." }, - { kicker: "1973 · Nepal", history: "nepal-shops-closed-1973", text: "Kathmandu had licensed cannabis shops until 16 July 1973, when [[NP|Nepal]] cancelled every licence under pressure from the United States and the United Nations." }, + { kicker: "1973 · Nepal", history: "nepal-shops-closed-1973", text: "Kathmandu had [[c:traditions/freak-street|licensed cannabis shops]] until 16 July 1973, when [[NP|Nepal]] cancelled every licence under pressure from the United States and the United Nations." }, { kicker: "1975 · Comoros", history: "comoros-legalisation-1975", text: "Cannabis was legal in the [[KM|Comoros]] for three years: President Ali Soilih lifted the ban in 1975, and the government that overthrew him [[h:comoros-ban-restored-1978|restored it in 1978]]." }, { kicker: "1985 · Poland", history: "poland-drug-prevention-act-1985", text: "From 1985 to 1997 possessing drugs was not an offence in [[PL|Poland]] in any quantity: police could confiscate them and nothing more. Since [[h:poland-criminalisation-2000|December 2000]] any amount has been a crime." }, { kicker: "1975 · United States", history: "us-ravin-v-state-1975", text: "Since 1975 Alaska's constitution has protected having cannabis at home: the state's Supreme Court found it in the right to privacy." }, - { kicker: "1976 · South Korea", history: "south-korea-cannabis-control-act-1976", text: "Koreans grew hemp for cloth for centuries and smoking it was no offence until 1976. Today [[KR|South Korea]] [[h:south-korea-abroad-warning-2018|warns its citizens]] that using cannabis abroad, even where it is legal, can be punished when they come home." }, - { kicker: "1976 · United States", history: "us-randall-ruling-1976", text: "After a glaucoma patient won in court in 1976, the federal government of the [[US|United States]] began supplying patients with cannabis it grew itself. In 2011 four people were still receiving it." }, + { kicker: "1976 · South Korea", history: "south-korea-cannabis-control-act-1976", text: "Koreans grew hemp for [[c:traditions/sambe|cloth]] for centuries and smoking it was no offence until 1976. Today [[KR|South Korea]] [[h:south-korea-abroad-warning-2018|warns its citizens]] that using cannabis abroad, even where it is legal, can be punished when they come home." }, + { kicker: "1976 · United States", history: "us-randall-ruling-1976", text: "After [[c:people/robert-randall|a glaucoma patient]] won in court in 1976, the federal government of the [[US|United States]] began supplying patients with cannabis it grew itself. In 2011 four people were still receiving it." }, { kicker: "1980 · Japan", history: "japan-mccartney-arrest-1980", text: "[[JP|Japan]] held Paul McCartney for ten days in 1980 over 219 grams found in his luggage at Tokyo airport, then deported him without charge." }, { kicker: "1988 · United States", history: "us-dea-judge-young-1988", text: "In 1988 the drug agency's own judge in the [[US|United States]] ruled that cannabis should be rescheduled, calling it one of the safest therapeutically active substances known. The agency's head rejected the ruling." }, - { kicker: "1989 · Bangladesh", history: "bangladesh-ban-1989", text: "[[BD|Bangladesh]] had government-approved ganja shops until 1989, a leftover of colonial excise law." }, + { kicker: "1989 · Bangladesh", history: "bangladesh-ban-1989", text: "[[BD|Bangladesh]] had government-approved [[c:language/ganja|ganja]] shops until 1989, a leftover of colonial excise law." }, { kicker: "1989 · Bhutan", history: "bhutan-first-arrest-1989", text: "In [[BT|Bhutan]] cannabis grows prolifically and was long seen mainly as fodder for fattening pigs. The country's first drug arrest came only in 1989." }, { kicker: "1993 · Sweden", history: "sweden-prison-for-use-1993", text: "[[SE|Sweden]] added a prison term for drug use in 1993 for a practical reason: an offence that carries prison lets police take a suspect in for a urine or blood test." }, - { kicker: "1995 · Nepal", history: "nepal-pashupati-distribution-ended-1995", text: "Until 1995 the trust that runs [[NP|Nepal]]'s Pashupatinath temple handed holy men marijuana at the Shivaratri festival — taken from the Home Ministry's confiscated stock." }, { kicker: "2003 · Portugal", history: "portugal-seeds-law-2003", text: "[[PT|Portugal]]'s drug law controls one very specific thing: since 2003 its list has included \"cannabis seeds not intended for sowing\"." }, { kicker: "2003 · Switzerland", history: "switzerland-operation-indoor-2003", text: "For seven years shops in the Swiss canton of Ticino sold cannabis as scented sachets for wardrobes. When police ended it in 2003 they seized 198,000 plants — and thieves then stole three vanloads of it back from a military depot in [[CH|Switzerland]]." }, - { kicker: "2012 · Spain", history: "spain-rasquera-plantation-2012", text: "A village of 960 people in [[ES|Spain]] held a referendum in 2012 on renting land to a cannabis club for 1.3 million euros, about the size of its debt. A court cancelled the deal." }, + { kicker: "2012 · Spain", history: "spain-rasquera-plantation-2012", text: "A village of 960 people in [[ES|Spain]] held a referendum in 2012 on renting land to a [[c:traditions/cannabis-social-clubs|cannabis club]] for 1.3 million euros, about the size of its debt. A court cancelled the deal." }, { kicker: "2012 · Italy", history: "italy-seeds-ruling-2012", text: "[[IT|Italy]]'s top court ruled in 2012 that selling cannabis seeds is not a crime, because what the buyer will do with them cannot be known." }, { kicker: "2014 · Italy", history: "italy-army-cannabis-2014", text: "[[IT|Italy]]'s medical cannabis is grown by the army, at a military pharmaceutical plant in Florence. Its two varieties are called FM1 and FM2: Farmaceutico Militare." }, @@ -111,8 +111,36 @@ const fromHistory = [ { kicker: "2022 · Italy", history: "italy-referendum-blocked-2022", text: "More than 600,000 people in [[IT|Italy]] signed for a referendum on decriminalising home growing. The Constitutional Court ruled the question inadmissible, and no vote was held." }, { kicker: "2022 · Russia", history: "russia-griner-sentence-2022", text: "[[RU|Russia]] sentenced an American basketball player to nine years in 2022 for 0.7 grams of cannabis oil. She was freed in a prisoner exchange that December." }, - { kicker: "2024 · Denmark", history: "denmark-pusher-street-closed-2024", text: "For half a century hashish was sold openly from stalls in Christiania, the freetown in the capital of [[DK|Denmark]]. In 2024, after a series of gang shootings, the residents dug up the street themselves." }, { kicker: "2025 · Lebanon", history: "lebanon-cannabis-authority-2025", text: "[[LB|Lebanon]] became the first Arab country to [[h:lebanon-medical-cultivation-2020|legalise growing cannabis]] in 2020. It took five more years to appoint the regulator that issues the licences." }, { kicker: "2022–2025 · Thailand", history: "thailand-prescription-only-2025", text: "[[TH|Thailand]] went from [[h:thailand-decriminalisation-2022|thousands of open dispensaries]] to prescription-only in three years. Since June 2025 cannabis flower officially requires a prescription." }, - { kicker: "2024 · Morocco", history: "morocco-royal-pardon-2024", text: "[[MA|Morocco]]'s sultan [[h:morocco-hassan-regulations-1890|licensed tribes of the Rif to grow kif]] in 1890. In 2024 its king pardoned 4,831 people convicted, prosecuted or wanted over growing it." }, + { kicker: "2024 · Morocco", history: "morocco-royal-pardon-2024", text: "[[MA|Morocco]]'s sultan [[h:morocco-hassan-regulations-1890|licensed tribes of the Rif to grow]] [[c:language/kif|kif]] in 1890. In 2024 its king pardoned 4,831 people convicted, prosecuted or wanted over growing it." }, +]; + +// Curious cases from the cultural atlas. Each one restates its entry in /culture. +const fromCulture = [ + { kicker: "Words · 420", culture: "language/420", text: "[[c:language/420|420]], the worldwide code for cannabis and the date of its yearly demonstrations, began as the meeting time of five schoolboys in California in 1971." }, + { kicker: "Words · Arabic", culture: "language/hashish", text: "[[c:language/hashish|Hashish]] is simply Arabic for dried grass. It became the word for cannabis resin from Morocco to Afghanistan." }, + { kicker: "Words · Turkish", culture: "language/esrar", text: "The everyday Turkish word for cannabis, [[c:language/esrar|esrar]], is Arabic for ‘secrets’. A dervish poet who died about 1444 already wrote of eating it." }, + { kicker: "Words · Spanish", culture: "language/mota", text: "In old Spanish a [[c:language/mota|mota]] is a speck or a tuft of fluff left over from making linen. Since the end of the nineteenth century, in [[MX|Mexico]], it has meant marijuana; nobody knows how." }, + { kicker: "Words · Hawaiian", culture: "language/pakalolo", text: "The Hawaiian name for cannabis, [[c:language/pakalolo|pakalolo]], means ‘numbing tobacco’." }, + { kicker: "Words · Réunion", culture: "language/zamal", text: "On Réunion, part of [[FR|France]], cannabis is [[c:language/zamal|zamal]], and a man losing his temper is said to have ‘his zamal rising’." }, + { kicker: "Words · Malawi", culture: "language/chamba", text: "[[MW|Malawi]] has three famous C's: its fish, its tea and its [[c:language/chamba|chamba]], the country's word for cannabis." }, + { kicker: "Words · Mezz", culture: "language/reefer", text: "In the jazz slang of the 1930s, cannabis could be called ‘mezz’, after Mezz Mezzrow, a clarinettist at least as well known in the jazz world for supplying it. See [[c:language/reefer|reefer]]." }, + { kicker: "Religion · Brazil", culture: "traditions/santa-maria-in-santo-daime", text: "One branch of [[BR|Brazil]]'s ayahuasca church, Santo Daime, took up cannabis in the 1970s and named it [[c:traditions/santa-maria-in-santo-daime|Santa Maria]], after the Virgin. Its users called themselves marianos." }, + { kicker: "Religion · Réunion", culture: "traditions/zamal-on-reunion", text: "In Tamil temples on Réunion, a possessed priest smokes cannabis the gods ask for, and must show no effect at all: [[c:traditions/zamal-on-reunion|his indifference proves the god is in him]]." }, + { kicker: "Religion · Japan", culture: "traditions/hemp-in-shinto", text: "Shinto priests in [[JP|Japan]] [[c:traditions/hemp-in-shinto|purify with hemp fibre]], the symbol of purity, while the plant itself is under one of the strictest drug laws in the world." }, + { kicker: "Religion · Nepal", culture: "traditions/shivaratri-at-pashupatinath", history: "nepal-pashupati-distribution-ended-1995", text: "Until 1995 the trust that runs [[NP|Nepal]]'s Pashupatinath temple handed holy men marijuana at the [[c:traditions/shivaratri-at-pashupatinath|Shivaratri festival]] — taken from the Home Ministry's confiscated stock." }, + { kicker: "Festival · Bengal", culture: "traditions/bhang-at-bijoya", text: "In 1890s Bengal, on the last day of Durga Puja, every visitor was offered [[c:traditions/bhang-at-bijoya|a cup of bhang with sweets]], drunk, an excise officer told the Hemp Drugs Commission, like ‘drinking health’ in Europe." }, + { kicker: "Customs · Korea", culture: "traditions/sambe", text: "[[KR|Korea]] dresses its dead, and those who mourn them, in [[c:traditions/sambe|hemp cloth]]. The plant that makes it has been tightly controlled since 1976." }, + { kicker: "Customs · Poland", culture: "traditions/siemieniotka", text: "In Silesia, [[c:traditions/siemieniotka|hemp-seed soup]] is one of the dishes of Christmas Eve." }, + { kicker: "Customs · Scotland", culture: "traditions/halloween-hemp-seed-divination", text: "Robert Burns recorded [[c:traditions/halloween-hemp-seed-divination|a Halloween charm]] in which sowing hemp seed was supposed to reveal a future lover." }, + { kicker: "Medicine · Taiwan", culture: "traditions/hemp-seed-in-chinese-medicine", text: "In [[TW|Taiwan]] [[c:traditions/hemp-seed-in-chinese-medicine|hemp seed sold as medicine]] is legal and hemp seed that can sprout is a drug. A court in 2023 settled one case by asking whether the buyer's seeds had grown." }, + { kicker: "Places · Harlem", culture: "traditions/the-tea-pads-of-harlem", text: "Investigators for New York's 1944 La Guardia report counted about 500 [[c:traditions/the-tea-pads-of-harlem|tea pads]] in Harlem. In one, on a rooftop, smokers sat in pup tents, then came out to talk about the stars." }, + { kicker: "Places · Copenhagen", culture: "traditions/pusher-street", history: "denmark-pusher-street-closed-2024", text: "For half a century [[c:language/hashish|hashish]] was sold openly from stalls on [[c:traditions/pusher-street|Pusher Street]] in Christiania, the freetown in the capital of [[DK|Denmark]]. In 2024, after a series of gang shootings, the residents dug up the street themselves." }, + { kicker: "Archaeology · China", culture: "traditions/cannabis-in-the-graves-of-xinjiang", history: "china-jirzankal-study-2019", text: "In a grave in Turpan, western [[CN|China]], about 2,500 years old, a man was buried under [[c:traditions/cannabis-in-the-graves-of-xinjiang|a shroud of thirteen cannabis plants]]. Far to the west, in the Pamirs, mourners burnt it in wooden braziers." }, + { kicker: "History · DR Congo", culture: "traditions/bena-riamba", history: "dr-congo-bena-riamba-1881", text: "Nineteenth-century visitors recorded a cannabis-centred movement among the Bashilenge in today's [[CD|DR Congo]]. Its members called themselves [[c:traditions/bena-riamba|Bena Riamba]] — ‘sons of hemp’ — and used a communal pipe for holidays, trade agreements and peace settlements." }, + { kicker: "People · Israel", culture: "people/raphael-mechoulam", history: "israel-mechoulam-thc-1964", text: "[[c:people/raphael-mechoulam|The chemist who first isolated THC]] got his material from the police: 11 pounds of seized Lebanese hashish, which he carried to his laboratory in [[IL|Israel]] on a public bus." }, + { kicker: "People · Mexico", culture: "people/leopoldo-salazar-viniegra", history: "mexico-salazar-marijuana-myth-1938", text: "In 1938 [[c:people/leopoldo-salazar-viniegra|a Mexican psychiatrist]] told the Academy of Medicine that marijuana madness was a myth. A newspaper reported that he ended by handing his colleagues cigarettes that turned out to contain it." }, + { kicker: "People · India", culture: "people/william-oshaughnessy", text: "[[c:people/william-oshaughnessy|The doctor who brought cannabis into Western medicine]], in Calcutta in 1839, was knighted not for that but for building [[IN|India]]'s telegraph." }, + { kicker: "People · Uruguay", culture: "people/jose-mujica", history: "uruguay-incb-criticism-2013", text: "When the head of the UN drug board said [[UY|Uruguay]]'s cannabis law showed a ‘pirate attitude’, its president, [[c:people/jose-mujica|José Mujica]], told him to stop lying and come and see for himself." }, ]; @@ -127,4 +155,9 @@ function parse(text) { return { label: m[2], change }; } + if (m[1].startsWith("c:")) { + const entry = cultureEntries.find((e) => e.url === `culture/${m[1].slice(2)}/`); + if (!entry) throw new Error(`facts.js: unknown atlas entry "${m[1].slice(2)}"`); + return { label: m[2], entry }; + } const country = byId(m[1]); if (!country) throw new Error(`facts.js: unknown country "${m[1]}"`); @@ -135,9 +168,11 @@ function parse(text) { export function getFacts() { // `group` says where a fact comes from; the /did-you-know/ page lists them under it. - const all = [...fromHistory.map((f) => ({ ...f, group: "history" })), ...curated.map((f) => ({ ...f, group: "countries" })), ...computed().map((f) => ({ ...f, group: "scores" }))]; + const all = [...fromHistory.map((f) => ({ ...f, group: "history" })), ...curated.map((f) => ({ ...f, group: "countries" })), ...computed().map((f) => ({ ...f, group: "scores" })), ...fromCulture.map((f) => ({ ...f, group: "culture" }))]; return all.map((f) => { const history = f.history ? changes.find((ch) => ch.id === f.history) : null; if (f.history && !history) throw new Error(`facts.js: unknown history entry "${f.history}"`); - return { kicker: f.kicker, parts: parse(f.text), history, group: f.group }; + const culture = f.culture ? cultureEntries.find((e) => e.url === `culture/${f.culture}/`) : null; + if (f.culture && !culture) throw new Error(`facts.js: unknown atlas entry "${f.culture}"`); … 4 more lines
src/pages/culture/[section]/[slug].astro +5 −5
@@ -1,4 +1,4 @@ --- -// One entry of the cultural atlas: a word or a custom, explained, with its picture; beside it the +// One entry of the cultural atlas: a word, a custom or a person, explained, with its picture; beside it the // countries where it is said or kept, each with its score today, and the history entries it touches. import Base from "../../../layouts/Base.astro"; @@ -29,5 +29,5 @@ const written = e.written?.toISOString().slice(0, 10); <header class="ev-top ev-plain"> <div> - <p class="eyebrow"><a href={`${base}culture/`}>Culture</a> <span><a href={`${base}culture/${s.id}/`}>{s.name}</a></span>{e.origin && <span>{e.origin}</span>}</p> + <p class="eyebrow"><a href={`${base}culture/`}>Culture</a> <span><a href={`${base}culture/${s.id}/`}>{s.name}</a></span>{e.origin && <span>{e.origin}</span>}{e.life && <span>{e.life}</span>}</p> <h1>{e.title}</h1> <p class="lede">{e.summary}</p> @@ -44,5 +44,5 @@ const written = e.written?.toISOString().slice(0, 10); <article class="ev-main"> <section class="ev-article"> - <p class="ev-label">{s.id === "language" ? "The word" : "The tradition"}{e.model && <span class="ev-by"> · written by {e.model}{written && <>, <time datetime={written}>{formatDate(written)}</time></>}</span>}</p> + <p class="ev-label">{s.id === "language" ? "The word" : s.id === "people" ? "The life" : "The tradition"}{e.model && <span class="ev-by"> · written by {e.model}{written && <>, <time datetime={written}>{formatDate(written)}</time></>}</span>}</p> {e.image && ( <figure> @@ -63,5 +63,5 @@ const written = e.written?.toISOString().slice(0, 10); <aside class="ev-rail" aria-label="Countries, related entries and history"> <section class="ev-more"> - <h2 class="ev-label">{s.id === "language" ? "Where it is said" : "Where it is kept"}</h2> + <h2 class="ev-label">{s.id === "language" ? "Where it is said" : s.id === "people" ? "Where they worked" : "Where it is kept"}</h2> <ul class="cu-places"> {e.countries.map((c) => ( @@ -70,5 +70,5 @@ const written = e.written?.toISOString().slice(0, 10); </ul> </section> - {e.relatedEntries.length > 0 && <CultureList entries={e.relatedEntries} heading={s.id === "language" ? "Related words and traditions" : "Related traditions and words"} />} + {e.relatedEntries.length > 0 && <CultureList entries={e.relatedEntries} heading={s.id === "language" ? "Related words and traditions" : s.id === "people" ? "In the atlas" : "Related traditions and words"} />} {e.history.length > 0 && ( <section class="ev-more">
src/pages/culture/[section]/index.astro +2 −2
@@ -1,4 +1,4 @@ --- -// One part of the cultural atlas that is made of entries: /culture/language/, /culture/traditions/. +// One part of the cultural atlas that is made of entries: /culture/language/, /culture/traditions/, /culture/people/. import Base from "../../../layouts/Base.astro"; import CultureCards from "../../../components/CultureCards.astro"; @@ -73,5 +73,5 @@ const byCountry = [...new Set(entries.flatMap((e) => e.countries))] <div class="section-head"><div> <h2>By country</h2> - <p class="sub">Where each {s.one} is {s.id === "language" ? "said" : "kept"}. A country's name opens its page in the index.</p> + <p class="sub">Where each {s.one} {s.id === "language" ? "is said" : s.id === "people" ? "worked" : "is kept"}. A country's name opens its page in the index.</p> </div></div> <ul class="cu-by">
src/pages/culture/history.astro +0 −61
@@ -1,61 +0,0 @@ ---- -// Culture in the history: the places where the record of laws shows what people thought of -// cannabis and of those who used it. A hand-picked list of history entries, oldest first. -import Base from "../../layouts/Base.astro"; -import { changes } from "../../lib/countries.js"; - -const base = import.meta.env.BASE_URL; -// Places where the history on this site already records culture meeting law. Each must exist. -const threads = [ - ["uk-burns-halloween-1786", "Burns preserved a hemp-seed courtship charm in print. Cannabis appears as a familiar crop in seasonal folklore, with no intoxicating preparation involved."], - ["france-paradis-artificiels-1860", "Baudelaire made hashish a subject for an argument about imagination and the will. The artificial paradise attracted him as a literary problem, not a simple promise of creative freedom."], - ["netherlands-ruigoord-saved-1973", "Artists preserved a village threatened by harbour expansion. Ruigoord became a cultural enclave connected to Christiania and to documented cannabis gatherings."], - ["denmark-christiania-junk-blockade-1979", "Christiania excluded heroin while keeping cannabis. Its blockade combined community care with coercive rules about who could remain in the freetown."], - ["us-assassin-of-youth-1937", "A narcotics commissioner presented cannabis as an “assassin of youth”. The surviving magazine page shows how official authority and frightening anecdotes were turned into propaganda."], - ["us-reefer-madness-1938", "Tell Your Children, later known as Reefer Madness, made cannabis a screen menace. Later audiences turned its warnings into an underground joke."], - ["league-russell-anslinger-exchange-1938", "An exchange between international drug-control officials exposes disagreement behind the public presentation of cannabis as a danger."], - ["us-la-guardia-report-1944", "New York's investigation challenged claims about marijuana and crime, supplying a counterpoint to the sensational warnings."], - ["france-club-des-hashischins-1844", "Hashish experiments at a Paris mansion entered literature, and later legend, through Gautier's account of the Club des Hashischins."], - ["nepal-shops-closed-1973", "Kathmandu's Freak Street grew around licensed hashish shops and travellers' cafés. Cancelling the licences ended the legal market before the wider national ban."], - ["denmark-pusher-street-closed-2024", "Christiania's residents dug up Pusher Street after decades of open cannabis sales and escalating violence. A place associated with toleration was closed by its own community."], - ["india-hemp-drugs-commission-1894", "An inquiry of 1,200 witnesses found the habit widespread, and advised against banning it partly because of “the social and religious feeling on the subject”."], - ["india-bhang-exemption-1961", "India kept bhang out of the world treaty so that it could go on being drunk at Holi."], - ["nepal-pashupati-distribution-ended-1995", "Until 1995 a temple trust in Kathmandu handed cannabis to holy men at Shivaratri, from the Home Ministry's confiscated stock."], - ["jamaica-ganja-reform-2015", "Jamaica wrote Rastafari sacramental use into its law."], - ["transvaal-mine-dagga-survey-1908", "Asked in 1908 whether dagga should be banned, the managers of the Transvaal gold mines mostly said no: use was moderate, and restrictions would keep men from coming to work."], - ["south-africa-enforcement-compromise-1922", "A month after South Africa banned dagga, police were told to go easy in remote African areas, where an older man's morning pipe was “a custom so deep-rooted as almost to amount to a religious rite”."], - ["mexico-salazar-marijuana-myth-1938", "A Mexican health official told the Academy of Medicine that the madness of marijuana was a myth, and ended by handing his colleagues cigarettes of it."], - ["afghanistan-hashish-fertiliser-edicts-1969", "With Western travellers buying, Afghanistan's king issued edicts urging farmers to use fertiliser and grow more hashish."], - ["south-africa-natal-1870", "One of the first cannabis laws anywhere applied to one group only: Indian labourers in Natal."], - ["brazil-rio-pango-ban-1830", "Rio de Janeiro's ban of 1830 named the slaves who smoked it."], - ["egypt-first-ban-1868", "Egypt's first ban has been read as a centralising state's wish to civilise its lower classes."], -].map(([id, text]) => { - const ch = changes.find((x) => x.id === id); - if (!ch) throw new Error(`culture/history.astro: there is no history entry "${id}"`); - return { ch, text }; -}).sort((x, y) => x.ch.date.localeCompare(y.ch.date)); ---- -<Base title="History · Culture" description="Social attitudes, propaganda and counterculture in the history of cannabis law: the entries where the record of laws shows what people thought."> - <main class="changes-page culture"> - <div class="page-bar"><a class="back" href={`${base}culture/`}>← Culture</a></div> - <section class="hero hero-sm"> - <p class="eyebrow">Culture <span>{threads.length} entries</span></p> - <h1>History</h1> - <p class="lede">Propaganda films, sensational newspaper stories, inquiries that challenged them, and places where counterculture met the law. These entries connect cultural attitudes with the index's <a href={`${base}history/`}>record of laws</a>.</p> - </section> - - <section class="section cu-first"> - <ol class="culture-threads"> - {threads.map(({ ch, text }) => ( - <li> - <a href={`${base}history/${ch.id}/`}> - <time datetime={ch.date}>{ch.date.slice(0, 4)}</time> - <span>{ch.place.flag} {ch.place.name}</span> - <p>{text}</p> - </a> - </li> - ))} - </ol> - </section> - </main> -</Base>
src/pages/culture/index.astro +7 −4
@@ -1,8 +1,9 @@ --- // Culture: the way in to what the site knows about cannabis in culture. The index maps laws; -// this is about the words, customs and people behind them. Five parts, of which Language and -// Traditions are made of entries (/culture/<section>/*.md, see src/lib/culture.js). +// this is about the words, customs and people behind them. Four parts, of which Language, +// Traditions and People are made of entries (/culture/<section>/*.md, see src/lib/culture.js). import Base from "../../layouts/Base.astro"; import CultureCards from "../../components/CultureCards.astro"; +import DidYouKnow from "../../components/DidYouKnow.astro"; import { CULTURE_SECTIONS, cultureEntries, cultureIn } from "../../lib/culture.js"; @@ -12,5 +13,5 @@ const countryCount = new Set(cultureEntries.flatMap((e) => e.countries)).size; // as a large lead card; the rest are a click away. const preview = (id) => cultureIn(id).slice(0, 5); -const count = (s) => (s.entries ? `${cultureIn(s.id).length} ${cultureIn(s.id).length === 1 ? "entry" : "entries"}` : s.soon ? "In preparation" : s.id === "stories" ? "Collecting soon" : "From the record"); +const count = (s) => (s.entries ? `${cultureIn(s.id).length} ${cultureIn(s.id).length === 1 ? "entry" : "entries"}` : s.soon ? "In preparation" : "Collecting soon"); --- <Base title="Culture" description="A cultural atlas of cannabis around the world: the words people have for it, the rituals and traditions it belongs to, and the people behind the laws."> @@ -34,4 +35,6 @@ const count = (s) => (s.entries ? `${cultureIn(s.id).length} ${cultureIn(s.id).l </section> + <section class="section cu-dyk"><DidYouKnow group="culture" /></section> + {CULTURE_SECTIONS.filter((s) => s.entries).map((s) => ( <section class="section"> @@ -41,5 +44,5 @@ const count = (s) => (s.entries ? `${cultureIn(s.id).length} ${cultureIn(s.id).l </div></div> <CultureCards entries={preview(s.id)} lead /> - <p class="cu-all front-go"><a class="go" href={`${base}culture/${s.id}/`}>All {cultureIn(s.id).length} {s.id === "language" ? "words" : "traditions"} <span aria-hidden="true">→</span></a></p> + <p class="cu-all front-go"><a class="go" href={`${base}culture/${s.id}/`}>All {cultureIn(s.id).length} {{ language: "words", traditions: "traditions", people: "people" }[s.id]} <span aria-hidden="true">→</span></a></p> </section> ))}
src/pages/did-you-know.astro +7 −4
@@ -1,4 +1,4 @@ --- -// Every "Did you know?" case on one page, grouped by where it comes from. The home page shows +// Every "Did you know?" case on one page, grouped by where it comes from, the cultural atlas last. The home page shows // the same cases three at a time, shuffled; here they are all open and in a fixed order. import Base from "../layouts/Base.astro"; @@ -11,4 +11,5 @@ const groups = [ ["countries", "From the country profiles", "Rules that are odd, generous or harsh in one particular place."], ["history", "From the history", "Moments from two centuries of cannabis law, oldest first."], + ["culture", "From the culture", "Words, customs, faiths and people from the cultural atlas."], ].map(([id, name, sub]) => ({ id, name, sub, facts: facts.filter((f) => f.group === id) })); --- @@ -18,5 +19,5 @@ const groups = [ <p class="eyebrow">Cannabis Freedom Index</p> <h1>Did you know?</h1> - <p class="lede">{facts.length} curious cases from the index: strange rules, forgotten laws and what the scores show. Each one links to the country or the <a href={`${base}history/`}>history</a> entry it comes from.</p> + <p class="lede">{facts.length} curious cases from the index: strange rules, forgotten laws, what the scores show and what the culture keeps. Each one links to the country, the <a href={`${base}history/`}>history</a> entry or the <a href={`${base}culture/`}>atlas</a> entry it comes from.</p> </section> {groups.map((g) => ( @@ -33,7 +34,9 @@ const groups = [ {f.parts.map((part) => typeof part === "string" ? part : part.country ? <a href={`${base}country/${part.country.slug}/`}>{part.label}</a> - : <a href={`${base}history/${part.change.id}/`}>{part.label}</a>)} + : part.entry ? <a href={`${base}${part.entry.url}`}>{part.label}</a> + : part.entry ? <a href={`${base}${part.entry.url}`}>{part.label}</a> + : <a href={`${base}history/${part.change.id}/`}>{part.label}</a>)} </p> - {f.history && <a class="dyk-more" href={`${base}history/${f.history.id}/`}>The full story →</a>} + {f.culture ? <a class="dyk-more" href={`${base}${f.culture.url}`}>Read the entry →</a> : f.history && <a class="dyk-more" href={`${base}history/${f.history.id}/`}>The full story →</a>} </li> ))}
src/pages/history/[id].astro +1 −1
@@ -73,5 +73,5 @@ const related = relatedTo(ch, nearby); <a href={`${base}${e.url}`}> {e.image ? <Image src={e.image.src} alt="" width={240} height={160} fit="cover" /> : <span class="ev-culture-none" aria-hidden="true">{e.title.slice(0, 1)}</span>} - <span><small>{cultureSection(e.section).name}{e.origin && ` · ${e.origin}`}</small><b>{e.title}</b><span>{e.summary}</span></span> + <span><small>{cultureSection(e.section).name}{e.origin && ` · ${e.origin}`}{e.life && ` · ${e.life}`}</small><b>{e.title}</b><span>{e.summary}</span></span> </a> </li>
src/pages/history/index.astro +12 −3
@@ -5,6 +5,16 @@ import Base from "../../layouts/Base.astro"; import HistoryList from "../../components/HistoryList.astro"; import { researchTotals } from "../../lib/research.js"; +import { changes, places } from "../../lib/countries.js"; const base = import.meta.env.BASE_URL; +// the history in figures, under the research progress +const num = (n) => n.toLocaleString("en-GB"); +const dated = changes.filter((ch) => !ch.estimate); +const figures = [ + [dated.length, "entries"], + [dated.filter((ch) => ch.score).length, "moved a score"], + [new Set(changes.filter((ch) => ch.country).map((ch) => ch.country)).size, `of ${places.length} places`], + [`${Math.round((dated.filter((ch) => ch.checked).length / dated.length) * 100)}%`, "checked"], +]; --- <Base title="History" description="Laws, court rulings and treaties that shaped cannabis freedom, from the first bans to today, and how each one moved a country's score on the Cannabis Freedom Index."> @@ -12,7 +22,6 @@ const base = import.meta.env.BASE_URL; <section class="hero hero-sm hero-progress"> <a class="rs-pill" href={`${base}research/`} title={`Average research progress over ${researchTotals.places} countries and territories. Open the details.`}> - <span>Research progress</span> - <i style={`--p:${researchTotals.average}%`}></i> - <b>{researchTotals.average}%</b> + <span class="rs-top"><span>Research progress</span><i style={`--p:${researchTotals.average}%`}></i><b>{researchTotals.average}%</b></span> + <span class="rs-figs">{figures.map(([n, label]) => <span><b>{typeof n === "number" ? num(n) : n}</b> {label}</span>)}</span> </a> <p class="eyebrow">History</p>
src/pages/og/[...path].png.js +0 −1
@@ -57,5 +57,4 @@ const cards = { articles: page("Articles", "Moments from the history of cannabis law told in full.", [[num(articles.size), "ARTICLES"]]), culture: page("A cultural atlas of cannabis", "The words people have for the plant, the rituals and traditions it belongs to, and the people behind the laws.", [[String(cultureEntries.length), "ENTRIES"]]), - "culture/history": page("Culture in the history", "Social attitudes, propaganda and counterculture: where the record of laws shows what people thought.", [], `CULTURE · ${BRAND}`), "culture/stories": page("The people behind the laws", "A participatory anthropology project on how cannabis shapes, and is shaped by, society.", [], `CULTURE · ${BRAND}`), sources: page("What the index is built on", "Every source the index cites, counted by website and by country."),
src/pages/search.json.js +1 −1
@@ -19,5 +19,5 @@ const rows = [ ["History", "Laws, rulings and treaties", "history/"], ["Can I?", "Plain answers per country", "can-i/"], ["Compare", "Countries side by side", "compare/"], ["Download the data", "Scores, history and yearly panel", "data/"], ["Changelog", "Every score change", "changelog/"], - ["Articles", "The longer reads on single events", "articles/"], ["About", "What the project is, its aims and commitments", "about/"], ["Did you know?", "Curious cases from the index", "did-you-know/"], ["State of Cannabis", "The yearly survey and its results", "survey/"], ["Take the survey", "Anonymous, about ten minutes", "survey/take/"], ["Culture", "A cultural atlas of cannabis", "culture/"], ["Culture: History", "Attitudes, propaganda and counterculture in the record of laws", "culture/history/"], ["Culture: Stories", "The people behind the laws", "culture/stories/"], ["Sources", "Every source the index cites", "sources/"], + ["Articles", "The longer reads on single events", "articles/"], ["About", "What the project is, its aims and commitments", "about/"], ["Did you know?", "Curious cases from the index", "did-you-know/"], ["State of Cannabis", "The yearly survey and its results", "survey/"], ["Take the survey", "Anonymous, about ten minutes", "survey/take/"], ["Culture", "A cultural atlas of cannabis", "culture/"], ["Culture: People", "Officials, preachers, scientists and presidents", "culture/people/"], ["Culture: Stories", "The people behind the laws", "culture/stories/"], ["Sources", "Every source the index cites", "sources/"], ].map(([n, s, u]) => ({ t: "p", n, s, u })), // the cultural atlas: its parts that hold entries, then every word and tradition, findable by its other names too
src/styles/global.css +22 −3
@@ -279,5 +279,4 @@ th.num-col { text-align: right; } .drawer-inner .d-head { padding-right: 92px; } .drawer-inner .drawer-open { display: flex; justify-content: center; padding: 12px 16px; font-size: 15px; margin: 22px 0 0; } -.drawer-inner .c-sources { display: none; } /* Shown while the article downloads; fades in late so a fast load never flashes it. */ .drawer-loading { @@ -1364,5 +1363,5 @@ details.segrow .segrow-top > span, .segrow:not(details) .segrow-top > span { fon .section.cu-first { padding-top: clamp(28px, 4vw, 48px); } /* the five parts side by side, each a short column: name and count, then one or two lines */ -.culture-threads.cu-sections { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 0; } +.culture-threads.cu-sections { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0; } .cu-sections li { border-left: 1px solid var(--border); } .cu-sections li:first-child { border-left: 0; } @@ -1430,4 +1429,18 @@ details.segrow .segrow-top > span, .segrow:not(details) .segrow-top > span { fon .c-culture li b i { font: 400 13px Inter, sans-serif; color: var(--muted); margin-left: 4px; } .c-culture li a:hover b { text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 3px; } +/* on a country profile: compact rows, in two columns where the rail is wide enough (the drawer, + or one column on a narrow screen), the first few shown and the rest behind "Show all" */ +.c-rail .c-culture { margin-bottom: 36px; } +.c-rail .c-culture ul { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 250px), 1fr)); column-gap: 24px; } +.c-rail .c-culture li a { grid-template-columns: 40px 1fr; gap: 12px; padding: 7px 0; } +.c-rail .c-culture img, .c-rail .c-culture-none { width: 40px; height: 40px; } +.c-rail .c-culture-none { font-size: 19px; } +.c-rail .c-culture li b { font-size: 17px; line-height: 1.2; } … 28 more lines