● Zion Boggan
repos/Docket/lib/neutrality.ts
zionboggan.com ↗
93 lines · typescript
History for this file →
1
 
2
 
3
const ALLOWED_SOURCE_HOSTS = [
4
  "congress.gov",
5
  "api.congress.gov",
6
  "govinfo.gov",
7
  "usaspending.gov",
8
  "fiscaldata.treasury.gov",
9
  "cbo.gov",
10
  "gpo.gov",
11
  "clerk.house.gov",
12
  "senate.gov",
13
  "openstates.org",
14
  "house.gov",
15
  "whitehouse.gov",
16
];
17
 
18
export function isAllowedSourceHost(url: string): boolean {
19
  let host: string;
20
  try {
21
    host = new URL(url).host.toLowerCase().replace(/^www\./, "");
22
  } catch {
23
    return false;
24
  }
25
  if (host.endsWith(".gov")) return true;
26
  return ALLOWED_SOURCE_HOSTS.includes(host);
27
}
28
 
29
 
30
export const BANNED_WORDS = [
31
  "slashed",
32
  "gutted",
33
  "slammed",
34
  "blasted",
35
  "massive",
36
  "tiny",
37
  "huge",
38
  "sweeping",
39
  "radical",
40
  "extreme",
41
  "controversial",
42
  "popular",
43
  "unpopular",
44
  "landmark",
45
  "historic",
46
  "devastating",
47
  "crippling",
48
  "generous",
49
  "stingy",
50
  "bloated",
51
  "wasteful",
52
  "common-sense",
53
  "partisan",
54
  "crucial",
55
  "vital",
56
  "narrowly",
57
  "barely",
58
  "overwhelmingly",
59
  "finally",
60
  "surprisingly",
61
  "key",
62
];
63
 
64
const BANNED_RE = new RegExp(
65
  `\\b(${BANNED_WORDS.join("|")})\\b`,
66
  "i"
67
);
68
 
69
export function findBannedWord(text: string): string | null {
70
  const m = BANNED_RE.exec(text);
71
  return m ? m[1].toLowerCase() : null;
72
}
73
 
74
 
75
export type RankingInputs = {
76
  actionDate: string;
77
  dollarAmount: number | null;
78
  affectedEstimate: number | null;
79
  actionType: string;
80
};
81
 
82
export type PartyCode = "D" | "R" | "I";
83
 
84
export function partyToken(p: PartyCode): string {
85
  switch (p) {
86
    case "D":
87
      return "var(--dk-party-d)";
88
    case "R":
89
      return "var(--dk-party-r)";
90
    default:
91
      return "var(--dk-party-i)";
92
  }
93
}