mirror of
https://github.com/GenderDysphoria/GenderDysphoria.fyi.git
synced 2025-02-25 08:56:17 +00:00
Merge pull request #39 from ScoreUnder/navcheck
Navigation checking script
This commit is contained in:
commit
cef58375eb
@ -1,6 +1,7 @@
|
||||
---
|
||||
date: "2020-01-26T20:41:55.827Z"
|
||||
title: "How Gender Dysphoria Manifests: Biochemical Dysphoria"
|
||||
linkTitle: "Biochemical Dysphoria"
|
||||
description: "The very real and biological factors of Gender Dysphoria that cause mental disturbance."
|
||||
preBody: '_disclaimer'
|
||||
classes:
|
||||
|
@ -1,6 +1,7 @@
|
||||
---
|
||||
date: "2020-01-26T20:41:55.827Z"
|
||||
title: "What is the Cause of Gender Incongruence"
|
||||
linkTitle: "Causes of Gender Dysphoria"
|
||||
description: "It's the hormones, baby."
|
||||
preBody: '_disclaimer'
|
||||
classes:
|
||||
|
@ -1,6 +1,7 @@
|
||||
---
|
||||
date: "2020-01-26T20:41:55.827Z"
|
||||
title: "Disorders of Sex Development: Gender is not Chromosomal"
|
||||
linkTitle: "Chromosomes"
|
||||
description: "DNA is more what you'd call guidelines, than actual rules."
|
||||
preBody: '_disclaimer'
|
||||
classes:
|
||||
|
@ -1,6 +1,7 @@
|
||||
---
|
||||
date: "2020-01-26T20:41:55.827Z"
|
||||
title: "In Conclusion"
|
||||
linkTitle: "Conclusion"
|
||||
description: "Enough with the gatekeeping already."
|
||||
siblings:
|
||||
prev: /gdb/second-puberty-fem
|
||||
|
@ -1,6 +1,7 @@
|
||||
---
|
||||
date: "2020-01-26T20:41:55.827Z"
|
||||
title: "Diagnosing Gender Dysphoria"
|
||||
linkTitle: "Clinical Diagnoses"
|
||||
description: "It's clinical."
|
||||
preBody: '_disclaimer'
|
||||
classes:
|
||||
|
@ -1,6 +1,7 @@
|
||||
---
|
||||
date: "2020-01-26T20:41:55.827Z"
|
||||
title: "How Gender Dysphoria Manifests: Euphoria"
|
||||
linkTitle: "Gender Euphoria"
|
||||
description: "In order for there to be shadow there must be light."
|
||||
preBody: '_disclaimer'
|
||||
siblings:
|
||||
|
@ -1,6 +1,7 @@
|
||||
---
|
||||
date: "2020-01-26T20:41:55.827Z"
|
||||
title: "How Gender Dysphoria Manifests: Existential Dysphoria"
|
||||
linkTitle: "Existential Dysphoria"
|
||||
description: "I don't regret the things I have done, I regret the things I didn't do when I had the chance."
|
||||
classes:
|
||||
- gdb
|
||||
|
@ -1,6 +1,7 @@
|
||||
---
|
||||
date: "2020-01-26T20:41:55.827Z"
|
||||
title: "A Brief History of Gender Dysphoria"
|
||||
linkTitle: "The History of Gender Dysphoria"
|
||||
description: "The origins of Gender Dysphoria and the current meaning today."
|
||||
classes:
|
||||
- gdb
|
||||
|
@ -1,6 +1,7 @@
|
||||
---
|
||||
date: "2020-01-26T20:41:55.827Z"
|
||||
title: "Hormones: How do they work"
|
||||
linkTitle: "How Hormones Work"
|
||||
description: "It's nothing like magnets."
|
||||
preBody: '_disclaimer'
|
||||
siblings:
|
||||
|
@ -1,6 +1,7 @@
|
||||
---
|
||||
date: "2020-01-26T20:41:55.827Z"
|
||||
title: "Impostor Syndrome, but make it Trans"
|
||||
linkTitle: "Impostor Syndrome"
|
||||
description: "Am I really trans?"
|
||||
preBody: '_disclaimer'
|
||||
siblings:
|
||||
|
@ -1,6 +1,7 @@
|
||||
---
|
||||
date: "2020-01-26T20:41:55.827Z"
|
||||
title: "Managed Dysphoria: Gender in Disguise"
|
||||
linkTitle: "Managed Dysphoria"
|
||||
description: "I don't regret the things I have done, I regret the things I didn't do when I had the chance."
|
||||
preBody: '_disclaimer'
|
||||
siblings:
|
||||
|
@ -1,6 +1,7 @@
|
||||
---
|
||||
date: "2020-01-26T20:41:55.827Z"
|
||||
title: "How Gender Dysphoria Manifests: Physical Dysphoria"
|
||||
linkTitle: "Physical Dysphoria"
|
||||
description: "Body discomfort is only one of the many ways Gender Dysphoria manifests."
|
||||
preBody: '_disclaimer'
|
||||
siblings:
|
||||
|
@ -1,6 +1,7 @@
|
||||
---
|
||||
date: "2020-01-26T20:41:55.827Z"
|
||||
title: "How Gender Dysphoria Manifests: Presentational Dysphoria"
|
||||
linkTitle: "Presentational Dysphoria"
|
||||
description: "Hoodies and sweatpants never go out of style."
|
||||
preBody: '_disclaimer'
|
||||
siblings:
|
||||
|
@ -1,6 +1,7 @@
|
||||
---
|
||||
date: "2020-01-26T20:41:55.827Z"
|
||||
title: "How Gender Dysphoria Manifests: Sexual Dysphoria"
|
||||
linkTitle: "Sexual Dysphoria"
|
||||
description: "Sometimes a Cigar doesn't want to be smoked."
|
||||
preBody: '_disclaimer'
|
||||
siblings:
|
||||
|
@ -1,6 +1,7 @@
|
||||
---
|
||||
date: "2020-01-26T20:41:55.827Z"
|
||||
title: "How Gender Dysphoria Manifests: Social Dysphoria"
|
||||
linkTitle: "Social Dysphoria"
|
||||
description: "Pronouns and Deadnames and Gendering, oh my."
|
||||
preBody: '_disclaimer'
|
||||
siblings:
|
||||
|
@ -1,6 +1,7 @@
|
||||
---
|
||||
date: "2020-01-26T20:41:55.827Z"
|
||||
title: "How Gender Dysphoria Manifests: Societal Dysphoria"
|
||||
linkTitle: "Societal Dysphoria"
|
||||
description: "Because a Role is a Role, and a Toll is a Toll, and it's a heavy toll to live the wrong role."
|
||||
preBody: '_disclaimer'
|
||||
siblings:
|
||||
|
143
tools/navigation.py
Executable file
143
tools/navigation.py
Executable file
@ -0,0 +1,143 @@
|
||||
#!/usr/bin/env python3
|
||||
import glob
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
import yaml
|
||||
|
||||
|
||||
def get_all_pages():
|
||||
return [file for file in glob.glob("gdb/*.md")
|
||||
if not file.endswith("/index.md")]
|
||||
|
||||
|
||||
def fix_web_path(page):
|
||||
return '/' + page[:-3]
|
||||
|
||||
|
||||
def parse_page_data(page):
|
||||
with open(page) as fd:
|
||||
return next(yaml.safe_load_all(fd))
|
||||
|
||||
|
||||
def most_appropriate_title(data):
|
||||
return data.get("linkTitle") or data['title']
|
||||
|
||||
|
||||
def traverse_siblings(pages, start, sibling='next'):
|
||||
page = start
|
||||
while page in pages:
|
||||
yield page
|
||||
page = pages[page]['siblings'].get(sibling)
|
||||
|
||||
|
||||
def create_intro_toc(pages, start, offset=2, file=sys.stdout):
|
||||
for num, page in enumerate(traverse_siblings(pages, start)):
|
||||
data = pages[page]
|
||||
title = most_appropriate_title(data)
|
||||
print(f"{num + offset}. [{title}]({page})\n", file=file)
|
||||
|
||||
|
||||
def overwrite_info_toc(pages, start, offset=2):
|
||||
old_name = "gdb/index.md"
|
||||
new_name = "gdb/.index.new"
|
||||
with open(old_name) as orig:
|
||||
with open(new_name, 'w') as new:
|
||||
found = False
|
||||
for line in orig:
|
||||
if found and '</div' in line:
|
||||
found = False
|
||||
create_intro_toc(pages, start, offset=offset, file=new)
|
||||
if not found and f'{offset}. [' in line:
|
||||
found = True
|
||||
if not found:
|
||||
new.write(line)
|
||||
os.rename(new_name, old_name)
|
||||
|
||||
|
||||
def create_navbar(pages, start, file=sys.stdout):
|
||||
longest_link = max(map(len, traverse_siblings(pages, start))) + 2
|
||||
|
||||
for page in traverse_siblings(pages, start):
|
||||
data = pages[page]
|
||||
title = most_appropriate_title(data)
|
||||
linksq = f"'{page}'"
|
||||
linkdq = f'"{page}"'
|
||||
print(f' <a href={linkdq:{longest_link}s} class="{{{{#is meta.url {linksq:{longest_link}s}}}}}active {{{{/is}}}}dropdown-item">{title}</a>', file=file)
|
||||
|
||||
|
||||
def overwrite_navbar(pages, start):
|
||||
old_name = "_gdb-menu.hbs"
|
||||
new_name = ".gdb-menu.new"
|
||||
with open(old_name) as orig:
|
||||
with open(new_name, 'w') as new:
|
||||
found = False
|
||||
for line in orig:
|
||||
if found and '</div' in line:
|
||||
found = False
|
||||
create_navbar(pages, start, file=new)
|
||||
if not found:
|
||||
new.write(line)
|
||||
if '="/gdb/"' in line:
|
||||
found = True
|
||||
os.rename(new_name, old_name)
|
||||
|
||||
|
||||
def check_nav_consistency(pages):
|
||||
for page in pages:
|
||||
siblings = pages[page]['siblings']
|
||||
for sibling in 'prev', 'next':
|
||||
sibling_data = pages.get(siblings.get(sibling))
|
||||
if sibling_data:
|
||||
sibling_title = most_appropriate_title(sibling_data)
|
||||
link_title = siblings[sibling + 'Caption']
|
||||
if sibling_title != link_title:
|
||||
print(f"{page}: caption mismatch for {sibling}: expected {sibling_title!r}, got {link_title!r}")
|
||||
|
||||
|
||||
def overwrite_nav_meta(pages):
|
||||
for page in pages:
|
||||
siblings = pages[page]['siblings']
|
||||
old_name = page.lstrip("/") + '.md'
|
||||
new_name = ".new.md"
|
||||
with open(old_name) as orig:
|
||||
with open(new_name, "w") as new:
|
||||
for line in orig:
|
||||
match = None
|
||||
for sibling in 'prev', 'next':
|
||||
sibling_data = pages.get(siblings.get(sibling))
|
||||
if sibling_data:
|
||||
sibling_title = most_appropriate_title(sibling_data)
|
||||
match = re.match(f"( *{sibling}Caption: *).*", line)
|
||||
if match:
|
||||
new.write(match.group(1) + sibling_title + "\n")
|
||||
break
|
||||
if not match:
|
||||
new.write(line)
|
||||
|
||||
os.rename(new_name, old_name)
|
||||
|
||||
|
||||
def check_excluded_pages(pages, first):
|
||||
missing = set(pages.keys()) - set(traverse_siblings(pages, first))
|
||||
if missing:
|
||||
print(f"Unlinked pages (starting from {first}): {missing}")
|
||||
|
||||
|
||||
def main():
|
||||
os.chdir("../public")
|
||||
pages = {fix_web_path(file): parse_page_data(file) for file in get_all_pages()}
|
||||
*_, first = traverse_siblings(pages, next(iter(pages)), sibling="prev")
|
||||
check_excluded_pages(pages, first)
|
||||
if '--write' in sys.argv:
|
||||
overwrite_info_toc(pages, first)
|
||||
overwrite_navbar(pages, first)
|
||||
overwrite_nav_meta(pages)
|
||||
else:
|
||||
create_intro_toc(pages, first)
|
||||
create_navbar(pages, first)
|
||||
check_nav_consistency(pages)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
Loading…
x
Reference in New Issue
Block a user