feat: accept short versions of traditional pronouns
This commit is contained in:
		
							parent
							
								
									0ce6453bf7
								
							
						
					
					
						commit
						92243d58ac
					
				
					 5 changed files with 67 additions and 26 deletions
				
			
		|  | @ -174,3 +174,12 @@ export const defaultAvatars = [ | |||
|   `${PUBLIC_BASE_URL}/default/512.webp`, | ||||
|   `${PUBLIC_BASE_URL}/default/512.jpg`, | ||||
| ]; | ||||
| 
 | ||||
| export interface PronounsJson { | ||||
|   pages: Pronouns; | ||||
|   autocomplete: Pronouns; | ||||
| } | ||||
| 
 | ||||
| interface Pronouns { | ||||
|   [key: string]: { pronouns: string[]; display?: string }; | ||||
| } | ||||
|  |  | |||
|  | @ -1,12 +1,22 @@ | |||
| { | ||||
|   "pronouns": { | ||||
|   "pages": { | ||||
|     "they": { "pronouns": ["they", "them", "their", "theirs", "themself"] }, | ||||
|     "they/them": { "pronouns": ["they", "them", "their", "theirs", "themself"] }, | ||||
|     "he": { "pronouns": ["he", "him", "his", "his", "himself"] }, | ||||
|     "he/him": { "pronouns": ["he", "him", "his", "his", "himself"] }, | ||||
|     "she": { "pronouns": ["she", "her", "her", "hers", "herself"] }, | ||||
|     "it": { "pronouns": ["it", "it", "its", "its", "itself"], "display": "it/its" } | ||||
|   }, | ||||
|   "autocomplete": { | ||||
|     "they/them": { "pronouns": ["they", "them", "their", "theirs", "themself"] }, | ||||
|     "they/them (singular)": { | ||||
|       "pronouns": ["they", "them", "their", "theirs", "themself"], | ||||
|       "display": "they/them (singular)" | ||||
|     }, | ||||
|     "they/them (plural)": { | ||||
|       "pronouns": ["they", "them", "their", "theirs", "themselves"], | ||||
|       "display": "they/them (plural)" | ||||
|     }, | ||||
|     "he/him": { "pronouns": ["he", "him", "his", "his", "himself"] }, | ||||
|     "she/her": { "pronouns": ["she", "her", "her", "hers", "herself"] }, | ||||
|     "it": { "pronouns": ["it", "it", "its", "its", "itself"], "display": "it/its" }, | ||||
|     "it/its": { "pronouns": ["it", "it", "its", "its", "itself"], "display": "it/its" } | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -11,7 +11,7 @@ | |||
|   } from "$lib/api/entities"; | ||||
|   import FallbackImage from "$lib/components/FallbackImage.svelte"; | ||||
|   import { userStore } from "$lib/store"; | ||||
|   import { Button, ButtonGroup, FormGroup, Icon, Input } from "sveltestrap"; | ||||
|   import { Alert, Button, ButtonGroup, FormGroup, Icon, Input, Popover } from "sveltestrap"; | ||||
|   import { encode } from "base64-arraybuffer"; | ||||
|   import { apiFetchClient } from "$lib/api/fetch"; | ||||
|   import IconButton from "$lib/components/IconButton.svelte"; | ||||
|  | @ -40,7 +40,6 @@ | |||
| 
 | ||||
|   let newName = ""; | ||||
|   let newPronouns = ""; | ||||
|   let newPronounsDisplay = ""; | ||||
|   let newLink = ""; | ||||
| 
 | ||||
|   let modified = false; | ||||
|  | @ -155,12 +154,23 @@ | |||
|   }; | ||||
| 
 | ||||
|   const addPronouns = () => { | ||||
|     pronouns = [ | ||||
|       ...pronouns, | ||||
|       { pronouns: newPronouns, display_text: newPronounsDisplay || null, status: WordStatus.Okay }, | ||||
|     ]; | ||||
|     if (newPronouns in data.pronouns) { | ||||
|       const fullSet = data.pronouns[newPronouns]; | ||||
|       pronouns = [ | ||||
|         ...pronouns, | ||||
|         { | ||||
|           pronouns: fullSet.pronouns.join("/"), | ||||
|           display_text: fullSet.display || null, | ||||
|           status: WordStatus.Okay, | ||||
|         }, | ||||
|       ]; | ||||
|     } else { | ||||
|       pronouns = [ | ||||
|         ...pronouns, | ||||
|         { pronouns: newPronouns, display_text: null, status: WordStatus.Okay }, | ||||
|       ]; | ||||
|     } | ||||
|     newPronouns = ""; | ||||
|     newPronounsDisplay = ""; | ||||
|   }; | ||||
| 
 | ||||
|   const addLink = () => { | ||||
|  | @ -353,22 +363,22 @@ | |||
|         <input | ||||
|           type="text" | ||||
|           class="form-control" | ||||
|           placeholder="Full set (e.g. it/it/its/its/itself)" | ||||
|           placeholder="New pronouns" | ||||
|           bind:value={newPronouns} | ||||
|           required | ||||
|         /> | ||||
|         <input | ||||
|           type="text" | ||||
|           class="form-control" | ||||
|           placeholder="Optional display text (e.g. it/its)" | ||||
|           bind:value={newPronounsDisplay} | ||||
|         /> | ||||
|         <IconButton | ||||
|           color="success" | ||||
|           icon="plus" | ||||
|           tooltip="Add pronouns" | ||||
|           disabled={newPronouns === ""} | ||||
|           click={() => addPronouns()} | ||||
|         /> | ||||
|         <Button id="pronouns-help" color="secondary"><Icon name="question" /></Button> | ||||
|         <Popover target="pronouns-help" placement="bottom"> | ||||
|           For common pronouns, the short form (e.g. "she/her" or "he/him") is enough; for less | ||||
|           common pronouns, you will have to use all five forms (e.g. "ce/cir/cir/cirs/cirself"). | ||||
|         </Popover> | ||||
|       </div> | ||||
|     </div> | ||||
|   </div> | ||||
|  |  | |||
|  | @ -1,7 +1,10 @@ | |||
| import type { APIError, MeUser } from "$lib/api/entities"; | ||||
| import type { APIError, MeUser, PronounsJson } from "$lib/api/entities"; | ||||
| import { apiFetchClient } from "$lib/api/fetch"; | ||||
| import { error } from "@sveltejs/kit"; | ||||
| 
 | ||||
| import pronounsRaw from "$lib/pronouns.json"; | ||||
| const pronouns = pronounsRaw as PronounsJson; | ||||
| 
 | ||||
| export const ssr = false; | ||||
| 
 | ||||
| export const load = async () => { | ||||
|  | @ -10,6 +13,7 @@ export const load = async () => { | |||
| 
 | ||||
|     return { | ||||
|       user, | ||||
|       pronouns: pronouns.autocomplete, | ||||
|     }; | ||||
|   } catch (e) { | ||||
|     throw error((e as APIError).code, (e as APIError).message); | ||||
|  |  | |||
|  | @ -1,9 +1,9 @@ | |||
| import { error } from "@sveltejs/kit"; | ||||
| import type { PageLoad } from "./$types"; | ||||
| import type { PronounsJson } from "$lib/api/entities"; | ||||
| 
 | ||||
| interface Pronouns { | ||||
|   [key: string]: { pronouns: string[]; display?: string }; | ||||
| } | ||||
| import pronounsRaw from "$lib/pronouns.json"; | ||||
| const pronouns = pronounsRaw as PronounsJson; | ||||
| 
 | ||||
| export const load = (async ({ params }) => { | ||||
|   const [param, displayText] = params.pronouns.split(","); | ||||
|  | @ -24,10 +24,18 @@ export const load = (async ({ params }) => { | |||
|     }; | ||||
|   } | ||||
| 
 | ||||
|   const pronouns: Pronouns = (await import("$lib/pronouns.json")).pronouns; | ||||
| 
 | ||||
|   if (params.pronouns in pronouns) { | ||||
|     const entry = pronouns[params.pronouns]; | ||||
|   if (params.pronouns in pronouns.pages) { | ||||
|     const entry = pronouns.pages[params.pronouns]; | ||||
|     return { | ||||
|       displayText: entry.display || "", | ||||
|       subjective: entry.pronouns[0], | ||||
|       objective: entry.pronouns[1], | ||||
|       possessiveDeterminer: entry.pronouns[2], | ||||
|       possessivePronoun: entry.pronouns[3], | ||||
|       reflexive: entry.pronouns[4], | ||||
|     }; | ||||
|   } else if (params.pronouns in pronouns.autocomplete) { | ||||
|     const entry = pronouns.autocomplete[params.pronouns]; | ||||
|     return { | ||||
|       displayText: entry.display || "", | ||||
|       subjective: entry.pronouns[0], | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue