From cec8cc6cc72fbc6c6056464c1d543ca7314e367d Mon Sep 17 00:00:00 2001 From: Jacob Hall Date: Sun, 9 Jun 2024 01:02:52 -0600 Subject: [PATCH 1/8] remove dogwood-specific code - these will be loaded using a submodule in future commits --- .DS_Store | Bin 6148 -> 0 bytes .ruby-version | 1 - _config_production.yml | 2 - _includes/analytics.html | 3 - _includes/body_classes.html | 19 - _includes/breadcrumbs.html | 36 - _includes/cover.html | 21 - _includes/custom-scripts.html | 3 - _includes/footer.html | 81 - _includes/head.html | 4 - _includes/inline_avatar.html | 9 - _includes/item_list.html | 109 -- _includes/item_time.html | 2 - _includes/load_event | 8 - _includes/load_people | 19 - _includes/names_list.html | 24 - _includes/page_meta.html | 42 - _includes/page_people_list.html | 12 - _includes/pagenav.html | 47 - _includes/people_list.html | 41 - _includes/person_footer.html | 0 _includes/posts_section.html | 24 - _includes/register_button.html | 4 - _includes/schedule_table.html | 40 - _includes/scripts.html | 6 - _includes/scripts/icon_loader.js | 19 - _includes/scripts/realtime_updater.js | 90 - _includes/scripts/smooth_anchor_scroller.js | 15 - _includes/scripts/time_localizer.js | 64 - _includes/site_meta.html | 68 - _includes/sitemap.html | 38 - _includes/tagged_pages_list.html | 15 - _includes/topbar.html | 47 - _includes/upcoming_events.html | 27 - _layouts/archives/month.html | 11 - _layouts/archives/posts-tag.html | 11 - _layouts/archives/posts-year.html | 32 - _layouts/default.html | 16 - _layouts/embedded-page.html | 23 - _layouts/page.html | 21 - _layouts/person.html | 118 -- _layouts/post.html | 17 - _layouts/project.html | 98 - _layouts/redirect.html | 9 - _layouts/session.html | 69 - _plugins/absolute-urls/Gemfile | 4 - _plugins/absolute-urls/absolute-urls.gemspec | 16 - _plugins/absolute-urls/lib/absolute-urls.rb | 25 - _plugins/post-aliases/Gemfile | 4 - _plugins/post-aliases/lib/post-aliases.rb | 38 - _plugins/post-aliases/post-aliases.gemspec | 16 - _plugins/unwrap-img/Gemfile | 4 - _plugins/unwrap-img/lib/unwrap-img.rb | 31 - _plugins/unwrap-img/unwrap-img.gemspec | 16 - _redirects/trees.md | 3 - _sass/dogwood/_base.scss | 45 - _sass/dogwood/_layout.scss | 1599 ----------------- _sass/dogwood/initialize.scss | 44 - _tools/embedded-page-cacher/index.js | 139 -- _tools/frontmatter-validator/index.js | 97 - .../frontmatter-validator/schemas/page.json | 281 --- .../frontmatter-validator/schemas/person.json | 77 - .../frontmatter-validator/schemas/post.json | 113 -- .../schemas/redirect.json | 18 - _tools/image-cacher/index.js | 112 -- _tools/people-validator/index.js | 106 -- _tools/thumbnail-generator/index.js | 68 - assets/avatar.jpg | Bin 12663 -> 0 bytes assets/style.scss | 5 - dogwood.gemspec | 25 - 70 files changed, 4251 deletions(-) delete mode 100644 .DS_Store delete mode 100644 .ruby-version delete mode 100644 _config_production.yml delete mode 100644 _includes/analytics.html delete mode 100644 _includes/body_classes.html delete mode 100644 _includes/breadcrumbs.html delete mode 100644 _includes/cover.html delete mode 100644 _includes/custom-scripts.html delete mode 100644 _includes/footer.html delete mode 100644 _includes/head.html delete mode 100644 _includes/inline_avatar.html delete mode 100644 _includes/item_list.html delete mode 100644 _includes/item_time.html delete mode 100644 _includes/load_event delete mode 100644 _includes/load_people delete mode 100644 _includes/names_list.html delete mode 100644 _includes/page_meta.html delete mode 100644 _includes/page_people_list.html delete mode 100644 _includes/pagenav.html delete mode 100644 _includes/people_list.html delete mode 100644 _includes/person_footer.html delete mode 100644 _includes/posts_section.html delete mode 100644 _includes/register_button.html delete mode 100644 _includes/schedule_table.html delete mode 100644 _includes/scripts.html delete mode 100644 _includes/scripts/icon_loader.js delete mode 100644 _includes/scripts/realtime_updater.js delete mode 100644 _includes/scripts/smooth_anchor_scroller.js delete mode 100644 _includes/scripts/time_localizer.js delete mode 100644 _includes/site_meta.html delete mode 100644 _includes/sitemap.html delete mode 100644 _includes/tagged_pages_list.html delete mode 100644 _includes/topbar.html delete mode 100644 _includes/upcoming_events.html delete mode 100644 _layouts/archives/month.html delete mode 100644 _layouts/archives/posts-tag.html delete mode 100644 _layouts/archives/posts-year.html delete mode 100644 _layouts/default.html delete mode 100644 _layouts/embedded-page.html delete mode 100644 _layouts/page.html delete mode 100644 _layouts/person.html delete mode 100644 _layouts/post.html delete mode 100644 _layouts/project.html delete mode 100644 _layouts/redirect.html delete mode 100644 _layouts/session.html delete mode 100644 _plugins/absolute-urls/Gemfile delete mode 100644 _plugins/absolute-urls/absolute-urls.gemspec delete mode 100644 _plugins/absolute-urls/lib/absolute-urls.rb delete mode 100644 _plugins/post-aliases/Gemfile delete mode 100644 _plugins/post-aliases/lib/post-aliases.rb delete mode 100644 _plugins/post-aliases/post-aliases.gemspec delete mode 100644 _plugins/unwrap-img/Gemfile delete mode 100644 _plugins/unwrap-img/lib/unwrap-img.rb delete mode 100644 _plugins/unwrap-img/unwrap-img.gemspec delete mode 100644 _redirects/trees.md delete mode 100644 _sass/dogwood/_base.scss delete mode 100644 _sass/dogwood/_layout.scss delete mode 100644 _sass/dogwood/initialize.scss delete mode 100644 _tools/embedded-page-cacher/index.js delete mode 100644 _tools/frontmatter-validator/index.js delete mode 100644 _tools/frontmatter-validator/schemas/page.json delete mode 100644 _tools/frontmatter-validator/schemas/person.json delete mode 100644 _tools/frontmatter-validator/schemas/post.json delete mode 100644 _tools/frontmatter-validator/schemas/redirect.json delete mode 100644 _tools/image-cacher/index.js delete mode 100644 _tools/people-validator/index.js delete mode 100644 _tools/thumbnail-generator/index.js delete mode 100644 assets/avatar.jpg delete mode 100644 assets/style.scss delete mode 100644 dogwood.gemspec diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 91d4bdc57954cc82c9b450252f3224a523ed7078..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKOKL(v5Uh?u1UD|ToD&3cgF*BJUO^=kmOJnf%=1%Mgd5oZr$^XKj(yQ_>5>3qj4PT1|=pAWm^sQPxox%YU)3*PYY zoqs&sCMYWfq<|EV0#ZN<{7M1uy|mdpQBev=0V!}%z`qZT?$`^5#Q1bD#0Wr~G9AWs z%o4=r31TlC5}Bb{Qi(~m8Zj*C%(trRg+pS}VKsbMooqFsSe(xHw - // paste your analytics trackers here - \ No newline at end of file diff --git a/_includes/body_classes.html b/_includes/body_classes.html deleted file mode 100644 index 83196a4..0000000 --- a/_includes/body_classes.html +++ /dev/null @@ -1,19 +0,0 @@ -{%- if page.layout -%} - layout-{{page.layout}} -{%- endif %} -{% if page.image -%} - has-image -{%- endif %} -{% if page.cover -%} - has-cover -{%- endif %} -{% assign path_parts = page.url | remove_first: '/' | remove_last: '/' | split: '/' -%} -{%- assign componenturl = '/' -%} -{%- for part in path_parts -%} - {%- assign componenturl = componenturl | append: part | append: '/' -%} - {%- assign componentpage = site.documents | find: 'url', componenturl -%} - {%- if componentpage and componentpage.title %} - page-{{ componentpage.title | slugify }} - {% endif -%} -{%- endfor %} -ispage-{{ page.title | slugify }} \ No newline at end of file diff --git a/_includes/breadcrumbs.html b/_includes/breadcrumbs.html deleted file mode 100644 index 19310d8..0000000 --- a/_includes/breadcrumbs.html +++ /dev/null @@ -1,36 +0,0 @@ - \ No newline at end of file diff --git a/_includes/cover.html b/_includes/cover.html deleted file mode 100644 index 0f4b20c..0000000 --- a/_includes/cover.html +++ /dev/null @@ -1,21 +0,0 @@ -{%- assign cover_image=page.cover | default: page.image -%} -{%- if cover_image or page.youtube or page.podbean or page.video_src -%} -
-
- {%- if page.video_src -%} - - {%- elsif page.youtube -%} - - {%- elsif page.podbean -%} - - {%- elsif cover_image -%} -
- - {%- if page.caption -%} -
{{page.caption | markdownify}}
- {%- endif -%} -
- {%- endif -%} -
-
-{%- endif -%} \ No newline at end of file diff --git a/_includes/custom-scripts.html b/_includes/custom-scripts.html deleted file mode 100644 index 914ac2f..0000000 --- a/_includes/custom-scripts.html +++ /dev/null @@ -1,3 +0,0 @@ - \ No newline at end of file diff --git a/_includes/footer.html b/_includes/footer.html deleted file mode 100644 index 39c1420..0000000 --- a/_includes/footer.html +++ /dev/null @@ -1,81 +0,0 @@ - diff --git a/_includes/head.html b/_includes/head.html deleted file mode 100644 index 88a592b..0000000 --- a/_includes/head.html +++ /dev/null @@ -1,4 +0,0 @@ - - {% include page_meta.html %} - {% include_cached site_meta.html %} - \ No newline at end of file diff --git a/_includes/inline_avatar.html b/_includes/inline_avatar.html deleted file mode 100644 index 7288da5..0000000 --- a/_includes/inline_avatar.html +++ /dev/null @@ -1,9 +0,0 @@ -{%- assign img = include.item.image -%} -{%- if img -%} - {%- assign first = img | slice: 0, 12 -%} - {%- if first == '/img/people/' -%} - {%- assign body = img | slice: 12, 1000 -%} - {%- assign img = "/img-thumbnails/people/" | append: body | append: ".webp" -%} - {%- endif -%} -{%- endif -%} - diff --git a/_includes/item_list.html b/_includes/item_list.html deleted file mode 100644 index eee952b..0000000 --- a/_includes/item_list.html +++ /dev/null @@ -1,109 +0,0 @@ -{% assign _items = include.items %} -{% assign collection = include.collection | default: _items.first.collection %} -{% assign category = _items.first.categories.first | slugify %} - -{%- assign show_image=true -%} -{%- assign image_length = _items | map: "image" | join: "" | strip_html | strip | size -%} -{%- assign logo_length = _items | map: "logo" | join: "" | strip_html | strip | size -%} -{%- assign sign_length = _items | map: "sign" | join: "" | strip_html | strip | size -%} -{%- assign youtube_length = _items | map: "youtube" | join: "" | strip_html | strip | size -%} -{%- if image_length == 0 and logo_length == 0 and youtube_length == 0 and sign_length == 0 -%} - {%- assign show_image=false -%} -{%- endif -%} - -
- {%- for item in _items -%} - {%- assign names=item.author | default: item.speaker -%} - {%- assign title=item.title -%} - {%- if include.titles -%} - {%- assign title=include.titles | slice: forloop.index0 -%} - {%- endif -%} - {%- if include.type=="simple" -%} - {% if include.ignore_name %} - {% if names==include.ignore_name %} - {% assign names = nil %} - {% else %} - {% assign exp = "item != '" | append: include.ignore_name | append: "'" %} - {% assign names = names | where_exp: "item", exp %} - {% endif %} - {% endif %} -
-

- {{title}} {% if item.youtube or item.podbean or item.video_src %}{% endif %} - {{item.date | date: site.date_format }} - {%-if names and names.size > 0 %} - ·| - {% if include.ignore_name %} - w/ - {% endif %} - {%- include names_list.html names=names avatar=false -%} - {%- endif -%} -

-

{{item.date | date: site.date_format }}

-
- {% else %} -
- {%- if show_image -%} -
- {%- assign imageurl = nil -%} - {%- assign image_style_class = 'rect-image' -%} - {%- if item.sign -%} - {%- assign imageurl = item.sign -%} - {%- assign image_style_class = 'app-sign' -%} - {%- elsif item.logo -%} - {%- assign imageurl = item.logo -%} - {%- assign image_style_class = 'contained-image' -%} - {%- elsif item.image -%} - {%- assign imageurl = item.image -%} - {%- assign first = imageurl | slice: 0, 11 -%} - {%- if first == '/img/posts/' -%} - {%- assign body = imageurl | slice: 11, 1000 -%} - {%- assign imageurl = "/img-thumbnails/posts/" | append: body | append: ".webp" -%} - {%- endif -%} - {%- elsif item.youtube -%} - {%- assign imageurl = 'https://i3.ytimg.com/vi/' | append: item.youtube | append: '/hqdefault.jpg' -%} - {%- endif -%} - {%- if imageurl -%} - - {%- endif -%} -
- {%- endif -%} -
- {%- if title and title.size > 0 -%} -

{{title}}

- {%- endif -%} - {%- if include.subtitles -%} -

{{include.subtitles | slice: forloop.index0 }}

- {%- elsif item.collection=='posts' -%} - {%- unless include.gallery -%} -

- {{item.date | date: site.date_format }} - {% if names %} - · - {% include names_list.html names=names %} - {% endif %} -

- {%- endunless -%} - {%- endif -%} - {%- unless include.gallery -%} -
- {% if item.blurb %} - {{ item.blurb | markdownify }} - {% else %} - {{ item.content | strip_html | markdownify | strip_html | truncatewords: 32 }} - {% endif %} -
- {%- include register_button.html item=item -%} - {%- endunless -%} -
-
- {%- endif -%} - {%- endfor -%} -
diff --git a/_includes/item_time.html b/_includes/item_time.html deleted file mode 100644 index 3e98e9e..0000000 --- a/_includes/item_time.html +++ /dev/null @@ -1,2 +0,0 @@ -{%- assign eventPage = site.pages | find: "title", include.item.event -%} -{{ include.item.date | date: "%l:%M %p" }} EST \ No newline at end of file diff --git a/_includes/load_event b/_includes/load_event deleted file mode 100644 index 5e4975d..0000000 --- a/_includes/load_event +++ /dev/null @@ -1,8 +0,0 @@ -{%- assign curDate = site.time | date: '%s' | minus: 86400 -%} -{%- assign page_date = include.item.date | date: '%s' | minus: 0 -%} -{%- assign event_is_past = true -%} -{%- assign event_is_future = false -%} -{%- if page_date > curDate -%} - {%- assign event_is_past = false -%} - {%- assign event_is_future = true -%} -{%- endif -%} \ No newline at end of file diff --git a/_includes/load_people b/_includes/load_people deleted file mode 100644 index dc2c639..0000000 --- a/_includes/load_people +++ /dev/null @@ -1,19 +0,0 @@ -{%- assign people="" | split: ',' -%} -{%- assign roles="" | split: ',' -%} -{%- if include.at -%} - {%- for person in site.people -%} - {%- for role in person.roles -%} - {%- if role.at == include.at and role.to == nil -%} - {%- assign roles=roles | push: role -%} - {%- assign people=people | push: person -%} - {%- endif -%} - {%- endfor -%} - {%- endfor -%} -{%- elsif include.names -%} - {%- for name in include.names -%} - {%- assign person_with_name = site.people | find: "title", name -%} - {%- if person_with_name -%} - {%- assign people=people | push: person_with_name -%} - {%- endif -%} - {%- endfor -%} -{%- endif -%} \ No newline at end of file diff --git a/_includes/names_list.html b/_includes/names_list.html deleted file mode 100644 index c3a8d83..0000000 --- a/_includes/names_list.html +++ /dev/null @@ -1,24 +0,0 @@ -{% for name in include.names %} - - {%- if include.names.size > 1 and name == include.names.last %} - and - {% endif -%} - {% assign _item=site.people | find: "title", name %} - {%- unless _item -%} - {%- assign _item=site.pages | find: "title", name -%} - {%- endunless -%} - {%- if _item.url -%} - - {%- if _item.collection=="people" and include.avatar!=false -%} - {%- include inline_avatar.html item=_item -%} - {%- endif -%} - {{- name -}} - - {%- else -%} - {{name}} - {%- endif -%} - {%- if include.names.last and include.names.size > 2 and name != include.names.last -%} - , - {% endif -%} - -{% endfor %} \ No newline at end of file diff --git a/_includes/page_meta.html b/_includes/page_meta.html deleted file mode 100644 index 14024d6..0000000 --- a/_includes/page_meta.html +++ /dev/null @@ -1,42 +0,0 @@ -{% if page.title or page.temp_title %} {{page.temp_title | default: page.title}} | {% endif %} {{site.title}} - - -{% assign description= page.content | strip_html | markdownify | strip_html | strip_newlines | truncate: 210 -%} -{%- if page.temp_blurb or page.blurb -%} - {%- assign description=page.temp_blurb | default: page.blurb | strip_html | markdownify | strip_html -%} -{% endif %} - -{% assign image=page.sign -%} -{%- unless image -%} - {% assign image=page.image -%} -{%- endunless -%} -{%- unless image %} - {%- assign image=page.cover -%} -{%- endunless -%} -{%- unless image -%} - {%- assign image=page.logo -%} -{%- endunless -%} -{%- unless image -%} - {%- if page.youtube %} - {%- assign image = "https://i3.ytimg.com/vi/" | append: page.youtube | append: "/hqdefault.jpg" -%} - {% endif %} -{%- endunless -%} -{%- if image %} - - -{% endif %} - - - - -{%- if page.image %} - -{% endif -%} diff --git a/_includes/page_people_list.html b/_includes/page_people_list.html deleted file mode 100644 index d4b335a..0000000 --- a/_includes/page_people_list.html +++ /dev/null @@ -1,12 +0,0 @@ -{%- assign max_people=include.max_people | default: 15 -%} -{%- include load_people at=page.title -%} -{%- assign people=people | slice: 0, max_people -%} -{%- assign roles=roles | slice: 0, max_people -%} -{%- if max_people > 0 and roles.size > 0 -%} -
-
-

Meet the {{page.team_name | default: "team"}}

-
- {%- include people_list.html people=people roles=roles gallery=true -%} -
-{%- endif -%} \ No newline at end of file diff --git a/_includes/pagenav.html b/_includes/pagenav.html deleted file mode 100644 index eac09a7..0000000 --- a/_includes/pagenav.html +++ /dev/null @@ -1,47 +0,0 @@ -{%- if page.title or pate.temp_title -%} - -{%- endif -%} \ No newline at end of file diff --git a/_includes/people_list.html b/_includes/people_list.html deleted file mode 100644 index 7d68e46..0000000 --- a/_includes/people_list.html +++ /dev/null @@ -1,41 +0,0 @@ -{% if include.at %} - {% include load_people at=include.at %} - {% assign _items = people %} - {% assign _roles = roles %} -{% else %} - {% assign _items = include.people %} - {% assign _roles = include.roles %} -{% endif %} -{%- assign gallery=include.gallery -%} -{%- assign content_length = _items | map: "content" | join: "" | strip_html | strip | size -%} -{%- if content_length == 0 -%} - {%- assign gallery=true -%} -{%- endif -%} -{% assign ranks_string = "President;Vice President;Secretary;Treasurer;Member At-Large;Executive Director;Program Director;Program Manager;Maintainer;Organizer;Advisor;Developer;default;Trails Stewardship Initiative Program Manager" %} -{% assign _ranks = ranks_string | split:";" %} - \ No newline at end of file diff --git a/_includes/person_footer.html b/_includes/person_footer.html deleted file mode 100644 index e69de29..0000000 diff --git a/_includes/posts_section.html b/_includes/posts_section.html deleted file mode 100644 index 61ffd03..0000000 --- a/_includes/posts_section.html +++ /dev/null @@ -1,24 +0,0 @@ -{%- assign max_posts=include.max_posts | default: 5 -%} -{%- assign tagged_posts = site.posts | where: "tags", include.tag -%} -{%- if tagged_posts.size > 0 and max_posts > 0 -%} -
-
- {%- assign label=include.label -%} - {%- if label==nil -%} - {%- assign label="News and talks" -%} - {%- assign news_count=tagged_posts | where: "category", "News" | size -%} - {%- if news_count==tagged_posts.size -%} - {%- assign label="News" -%} - {%- elsif news_count==0 -%} - {%- assign label="Talks" -%} - {%- endif -%} - {%- endif -%} -

{{label}}

- {%- if tagged_posts.size > max_posts -%} - See all posts - {%- endif -%} -
- {%- assign filtered_tagged_posts=tagged_posts | slice: 0, max_posts -%} - {%- include item_list.html items=filtered_tagged_posts -%} -
-{%- endif -%} \ No newline at end of file diff --git a/_includes/register_button.html b/_includes/register_button.html deleted file mode 100644 index 2cfe80c..0000000 --- a/_includes/register_button.html +++ /dev/null @@ -1,4 +0,0 @@ -{% include load_event item=include.item %} -{%- if include.item.register and event_is_future -%} -

Register

-{% endif %} \ No newline at end of file diff --git a/_includes/schedule_table.html b/_includes/schedule_table.html deleted file mode 100644 index b0b938d..0000000 --- a/_includes/schedule_table.html +++ /dev/null @@ -1,40 +0,0 @@ -{% assign sessions = include.items | sort: 'date' -%} - - - - - - - - - {%- for item in sessions -%} - - {%- assign names=item.author | default: item.speaker -%} - {%- assign title=item.title -%} - - - - {%- endfor -%} -
{{sessions[0].date | date: '%A, %B %e'}}
TimeSession
{%- include item_time.html item=item -%} - {%- if title and title.size > 0 -%} -

- {%- if item.url -%} - {{title}} {% if item.youtube or item.podbean or item.video_src %}{% endif %} - {%- else -%} - {{title}} - {%- endif -%} -

- {%- endif -%} -

- {% if names %} - {% include names_list.html names=names %} - {% endif %} -

-

- {% if item.blurb %} - {{ item.blurb | markdownify }} - {% else %} - {{ item.content | strip_html | markdownify | strip_html | truncatewords: 64 }} - {% endif %} -

-
\ No newline at end of file diff --git a/_includes/scripts.html b/_includes/scripts.html deleted file mode 100644 index 1c5198d..0000000 --- a/_includes/scripts.html +++ /dev/null @@ -1,6 +0,0 @@ - \ No newline at end of file diff --git a/_includes/scripts/icon_loader.js b/_includes/scripts/icon_loader.js deleted file mode 100644 index 30502d1..0000000 --- a/_includes/scripts/icon_loader.js +++ /dev/null @@ -1,19 +0,0 @@ -fetch("{{site.url}}{{site.baseurl}}/assets/icons/fa-solid.svg") - .then(function(response) { - return response.text(); - }) - .then(function(text) { - var div = document.createElement('div'); - div.innerHTML = text; - document.body.insertBefore(div, document.body.childNodes[0]); - }); - -fetch("{{site.url}}{{site.baseurl}}/assets/icons/fa-brands.svg") - .then(function(response) { - return response.text(); - }) - .then(function(text) { - var div = document.createElement('div'); - div.innerHTML = text; - document.body.insertBefore(div, document.body.childNodes[0]); - }); \ No newline at end of file diff --git a/_includes/scripts/realtime_updater.js b/_includes/scripts/realtime_updater.js deleted file mode 100644 index d139929..0000000 --- a/_includes/scripts/realtime_updater.js +++ /dev/null @@ -1,90 +0,0 @@ -document.addEventListener("DOMContentLoaded", function() { - - var scheduleRowsToCheck = document.querySelectorAll('table.schedule tr[start][end]'); - - if (scheduleRowsToCheck.length > 0) { - setInterval(checkScheduleRows, 1000); - checkScheduleRows(); - } - - function checkScheduleRows() { - var now = new Date(); - scheduleRowsToCheck.forEach(function(el) { - var start = new Date(parseInt(el.getAttribute('start') + '000')); - var end = new Date(parseInt(el.getAttribute('end') + '000')); - if (now >= start && now < end) { - if (!el.classList.contains('ongoing')) { - el.classList.add('ongoing'); - } - } else if (el.classList.contains('ongoing')) { - el.classList.remove('ongoing'); - } - }); - } - - var homepageUrl = document.querySelector('meta[name="homepage"]').getAttribute('content'); - var nextEventEl = document.querySelector('meta[name="dogwood-next-event"]'); - if (nextEventEl) createRealtimeMessage(); - - function createRealtimeMessage() { - - var title = nextEventEl.getAttribute('content'); - - var noticeInfo = JSON.parse(localStorage.getItem('notice-info')) || null; - if (noticeInfo && noticeInfo.title !== title) { - localStorage.removeItem('notice-info'); - noticeInfo = null; - } - - var end = new Date(parseInt(nextEventEl.getAttribute('end') + '000')); - var now = new Date(); - - // don't show something that's over - if (now > end) return; - - var link = nextEventEl.getAttribute('href'); - - // don't show if we're already on the promoted part of the site - if (window.location.href.startsWith(link) || - // or if we're on the homepage since content is already promoted there - window.location.href === homepageUrl + '/') return; - - var start = new Date(parseInt(nextEventEl.getAttribute('start') + '000')); - - if (now < start && - noticeInfo && - now.getTime() < noticeInfo.clicked + 172800000 - ) { - // don't notify again if event hasn't started yet and it's been under two days since last notified - return; - } - - var tagline = nextEventEl.getAttribute('tagline'); - var logo = nextEventEl.getAttribute('logo'); - - var notice = document.createElement('a'); - notice.setAttribute('href', link); - notice.setAttribute('id', 'notice-overlay'); - notice.classList.add(nextEventEl.getAttribute('noticeclass')); - var html = ''; - - if (logo) { - html += ''; - } - html += '
'; - var status = start > now ? 'Upcoming' : 'Happening Now'; - html += '
' + status + '
'; - html += '

' + title + '
' + tagline + '

' - html += ''; - - notice.innerHTML = html; - document.body.appendChild(notice); - - notice.addEventListener('click', function() { - localStorage.setItem('notice-info', JSON.stringify({ - title: title, - clicked: now.getTime() - })); - }); - } -}); \ No newline at end of file diff --git a/_includes/scripts/smooth_anchor_scroller.js b/_includes/scripts/smooth_anchor_scroller.js deleted file mode 100644 index 91f344a..0000000 --- a/_includes/scripts/smooth_anchor_scroller.js +++ /dev/null @@ -1,15 +0,0 @@ -// do smooth scroll when clicking an #anchor link instead of jumping -document.addEventListener('click', function(e) { - const origin = e.target.closest(`a`); - if (!origin || !origin.href) return; - - var parts = origin.href.match(/^([^#]*)#(.+)/); - if (parts && parts.length >=3 && parts[1] === (window.location.origin + location.pathname) && parts[2]) { - - // cancel jump - e.preventDefault(); - - var elmntToView = document.getElementById(parts[2]); - elmntToView.scrollIntoView({behavior: "smooth"}); - } -}); diff --git a/_includes/scripts/time_localizer.js b/_includes/scripts/time_localizer.js deleted file mode 100644 index e63fa59..0000000 --- a/_includes/scripts/time_localizer.js +++ /dev/null @@ -1,64 +0,0 @@ -document.addEventListener("DOMContentLoaded", function() { - document.querySelectorAll('.time').forEach(function(el) { - var targetTimeZone = el.getAttribute('totimezone') || undefined; - var sourceTime = el.getAttribute('time') && parseInt(el.getAttribute('time') + '000'); - var date = (sourceTime && new Date(sourceTime)) || parseTime(el.textContent); - var timeZoneLabel = date.toLocaleDateString(undefined, { - day: '2-digit', - timeZoneName: 'long', - timeZone: targetTimeZone, - }).substring(4); - var localizedTimeString = date.toLocaleString(undefined, { - hour: 'numeric', - minute: 'numeric', - timeZoneName: 'short', - timeZone: targetTimeZone, - }); - el.innerHTML = '' + localizedTimeString + ''; - }); - - document.querySelectorAll('.day-long').forEach(function(el) { - var targetTimeZone = el.getAttribute('totimezone') || undefined; - var sourceTime = el.getAttribute('time') && parseInt(el.getAttribute('time') + '000'); - var date = (sourceTime && new Date(sourceTime)) || new Date(); - var localizedTimeString = date.toLocaleDateString(undefined, { - weekday: 'long', - month: 'long', - day: 'numeric', - timeZone: targetTimeZone, - }); - el.innerHTML = localizedTimeString; - }); - - document.querySelectorAll('.timezone').forEach(function(el) { - var targetTimeZone = el.getAttribute('totimezone') || undefined; - var sourceTime = el.getAttribute('time') && parseInt(el.getAttribute('time') + '000'); - var date = (sourceTime && new Date(sourceTime)) || new Date(); - el.textContent = date.toLocaleDateString(undefined, { - day:'2-digit', - timeZoneName: 'long', - timeZone: targetTimeZone, - }).substring(4); - }); - - function parseTime(t) { - var time = t.match( /(\d+)(?::(\d\d))?\s*([pP]|[aA]?)/ ); - var h = parseInt(time[1]); - - // if am or pm - if (time[3]) { - h = h % 12; // normalize between 0 and 11 - - if (time[3].toLowerCase()[0] === 'p') { - h += 12; // add 12 hours if pm - } - } - - // hardcode UTC offset - h += 5; - // normalize between 0 and 23 - h = h % 24; - var m = parseInt( time[2]) || 0; - return new Date(Date.UTC(2024, 1, 19, h, m)); - } -}); \ No newline at end of file diff --git a/_includes/site_meta.html b/_includes/site_meta.html deleted file mode 100644 index 0a308be..0000000 --- a/_includes/site_meta.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - -{% assign sessions = site.posts | where_exp: "item", "item.url contains '/events/'" %} -{% assign future_sessions="" | split: ',' -%} -{% assign curDate = site.time | date: '%s' | minus: 86400 %} -{% for session in sessions %} - {% assign page_date = session.date | date: '%s' | minus: 0 %} - {% if page_date >= curDate %} - {% assign future_sessions = future_sessions | push: session %} - {% endif %} -{% endfor %} -{% assign next_session = future_sessions | reverse | first %} -{% if next_session %} - {% assign starttime = next_session.date | date: '%s' %} - {% assign endtime = starttime | plus: 3600 %} - {% if next_session.event %} - {% assign all_in_series = site.posts | where: 'event', next_session.event | sort: 'date' %} - {% assign first_in_series = all_in_series | first %} - {% assign last_in_series = all_in_series | last %} - {% assign starttime = first_in_series.date | date: '%s' %} - {% assign endtime = last_in_series.date | date: '%s' | plus: 3600 %} - {% assign next_session = site.pages | find_exp: "item", "item.title==next_session.event or item.temp_title==next_session.event" %} - {% endif %} - -{% endif %} - - -{% for feed in site.feeds %} - -{% endfor %} \ No newline at end of file diff --git a/_includes/sitemap.html b/_includes/sitemap.html deleted file mode 100644 index cab27d9..0000000 --- a/_includes/sitemap.html +++ /dev/null @@ -1,38 +0,0 @@ -
- {%- assign site_links=site.footer_links | default: site.links -%} - {%- for site_link in site_links -%} - {%- assign linked_page=site.pages | find: "url", site_link.link -%} - - {%- endfor -%} -
\ No newline at end of file diff --git a/_includes/tagged_pages_list.html b/_includes/tagged_pages_list.html deleted file mode 100644 index 7dfd150..0000000 --- a/_includes/tagged_pages_list.html +++ /dev/null @@ -1,15 +0,0 @@ -{%- assign linked_pages="" | split: ',' -%} -{%- for tag in page.tags -%} - {%- assign linked_page=site.pages | find: "title", tag -%} - {%- if linked_page -%} - {%- assign linked_pages=linked_pages | push: linked_page -%} - {%- endif -%} -{%- endfor -%} -{%- if linked_pages.size > 0 -%} -
-
-

More info

-
- {% include item_list.html items=linked_pages %} -
-{%- endif -%} \ No newline at end of file diff --git a/_includes/topbar.html b/_includes/topbar.html deleted file mode 100644 index 0b859e6..0000000 --- a/_includes/topbar.html +++ /dev/null @@ -1,47 +0,0 @@ -
-
- - - {{ site.title }} - - -
-
\ No newline at end of file diff --git a/_includes/upcoming_events.html b/_includes/upcoming_events.html deleted file mode 100644 index f34493e..0000000 --- a/_includes/upcoming_events.html +++ /dev/null @@ -1,27 +0,0 @@ - -{% assign sessions = site.posts | where_exp: "item", "item.url contains '/events/'" %} -{% assign past_sessions="" | split: ',' -%} -{% assign future_sessions="" | split: ',' -%} -{% if include.category %} - {% assign sessions = sessions | where: "category", include.category %} -{% endif %} -{% assign curDate = site.time | date: '%s' | minus: 86400 %} -{% for session in sessions %} - {% assign page_date = session.date | date: '%s' | minus: 0 %} - {% if page_date < curDate %} - {% unless session.image==nil and session.youtube==nil %} - {% assign past_sessions = past_sessions | push: session %} - {% endunless %} - {% else %} - {% assign future_sessions = future_sessions | push: session %} - {% endif %} -{% endfor %} -{% assign future_sessions = future_sessions | reverse %} -{% if future_sessions.size > 0 %} -
-
-

Upcoming event{% if future_sessions.size!=1 %}s{% endif %}

-
- {% include item_list.html items=future_sessions %} -
-{% endif %} \ No newline at end of file diff --git a/_layouts/archives/month.html b/_layouts/archives/month.html deleted file mode 100644 index 5d7e500..0000000 --- a/_layouts/archives/month.html +++ /dev/null @@ -1,11 +0,0 @@ ---- ---- - - - - -{%- assign redirect_base_len=page.url.size | minus: 3 -%} -{%- assign redirect_base=page.url|slice: 0, redirect_base_len -%} - - - diff --git a/_layouts/archives/posts-tag.html b/_layouts/archives/posts-tag.html deleted file mode 100644 index a02aa4b..0000000 --- a/_layouts/archives/posts-tag.html +++ /dev/null @@ -1,11 +0,0 @@ ---- -layout: default ---- -
-
-
-

Posts tagged "{{ page.title }}"

-
- {% include item_list.html items=page.posts %} -
-
diff --git a/_layouts/archives/posts-year.html b/_layouts/archives/posts-year.html deleted file mode 100644 index 518fb80..0000000 --- a/_layouts/archives/posts-year.html +++ /dev/null @@ -1,32 +0,0 @@ ---- -layout: default ---- -
-

Posts published in {{ page.date | date: "%Y" }}

- {% assign posts=page.posts | reverse %} - {% assign lowerindex=0 %} - {% assign upperindex=0 %} - {% for i in (1..12) %} - {% for post in posts %} - {% assign post_month = post.date | date: "%m" | minus: 0 %} - {% if post_month > i %} - {% assign upperindex=forloop.index0 %} - {% break %} - {% elsif post==posts.last %} - {% assign upperindex=forloop.index0 | plus: 1 %} - {% break %} - {% endif %} - {% endfor %} - {% if lowerindex < upperindex %} - {% assign post_count=upperindex | minus: lowerindex %} - {% assign month_posts=posts | slice: lowerindex, post_count %} -
- - {% include item_list.html items=month_posts %} -
- {% endif %} - {% assign lowerindex=upperindex %} - {% endfor %} -
diff --git a/_layouts/default.html b/_layouts/default.html deleted file mode 100644 index 384516d..0000000 --- a/_layouts/default.html +++ /dev/null @@ -1,16 +0,0 @@ ---- ---- - - -{% include head.html %} - - {% include_cached analytics.html %} - {% include_cached topbar.html %} -
- {{content}} -
- {% include_cached footer.html %} - {% include_cached scripts.html %} - {% include_cached custom-scripts.html %} - - \ No newline at end of file diff --git a/_layouts/embedded-page.html b/_layouts/embedded-page.html deleted file mode 100644 index 4852fb4..0000000 --- a/_layouts/embedded-page.html +++ /dev/null @@ -1,23 +0,0 @@ ---- -layout: default ---- - -
-
- {%- include breadcrumbs.html -%} - {%- include pagenav.html -%} -
-
- {%- assign embedsrc = page.embedded | default: page.embedded_remote -%} - -
-
-
- {{ content }} -
-
-
diff --git a/_layouts/page.html b/_layouts/page.html deleted file mode 100644 index a68c6cb..0000000 --- a/_layouts/page.html +++ /dev/null @@ -1,21 +0,0 @@ ---- -layout: default ---- -
-
-
- {%- include breadcrumbs.html -%} - {%- include pagenav.html -%} -
-
- {%- include cover.html -%} -
-
-
- {{content}} -
- {%- include posts_section.html tag=page.title max_posts=page.max_posts -%} -
-
- -
diff --git a/_layouts/person.html b/_layouts/person.html deleted file mode 100644 index 426416f..0000000 --- a/_layouts/person.html +++ /dev/null @@ -1,118 +0,0 @@ ---- -layout: default ---- -{% assign content = page.content | strip_newlines %} -{% assign talks = site.posts | where: "speaker", page.title %} -{% assign authored_posts = site.posts | where: "author", page.title %} -{% assign tagged_posts = site.posts | where: "tags", page.title %} -{% if page.cover %} - {% include cover.html %} -{% else %} -
-{% endif %} -
-
-
- -
-
-
-

{{page.title}}

- {%- if page.osm -%} - @{{page.osm}} - {%- endif -%} -
- {%- if content != '' -%} -
- {{content}} -
- {%- endif -%} - {%- if page.roles -%} -
-
    - {%- for role in page.roles -%} - {%- if role.at -%} -
  • - {%- if role.title -%} - {{role.title}}, - {% endif -%} - {% assign at_page=site.pages | find: "title", role.at -%} - {%- assign at = role.at -%} - {%- if at == "OpenStreetMap US Staff" -%} - {%- assign at = "OpenStreetMap US" -%} - {%- endif -%} - - {%- if at_page -%} - {{at}} - {%- else -%} - {{at}} - {%- endif -%} - - {%- if role.from %} ({{role.from | date: "%Y" }}–{%- if role.to -%}{{role.to | date: "%Y" }}{%- else -%}present{%- endif -%}){%- endif -%} -
  • - {%- endif -%} - {%- endfor -%} -
-
- {%- endif -%} - {%- if page.website or page.wikipedia or page.mastodon or page.twitter or page.github or page.linkedin or page.medium -%} - - {%- endif -%} -
-
- {%- if talks.size > 0 -%} -
-

Talks

-
- {%- include item_list.html items=talks type="simple" ignore_name=page.title -%} -
-
- {%- endif -%} - {%- if authored_posts.size > 0 -%} -
-

Authored posts

-
- {%- include item_list.html items=authored_posts type="simple" ignore_name=page.title -%} -
-
- {%- endif -%} - {%- if tagged_posts.size > 0 -%} -
-

Mentions

-
- {%- include item_list.html items=tagged_posts type="simple" -%} -
-
- {%- endif -%} -
-

-
- {%- include person_footer.html -%} - {%- if page.updated -%} -

Last updated {{page.updated | date: "%B %Y" }}.

- {% endif %} -
-
-
\ No newline at end of file diff --git a/_layouts/post.html b/_layouts/post.html deleted file mode 100644 index 595945f..0000000 --- a/_layouts/post.html +++ /dev/null @@ -1,17 +0,0 @@ ---- -layout: default ---- -
- {% include cover.html %} -
-
- - {% include pagenav.html %} -
-
-
- {{content}} -
- {%- include tagged_pages_list.html -%} -
-
diff --git a/_layouts/project.html b/_layouts/project.html deleted file mode 100644 index 7b9d477..0000000 --- a/_layouts/project.html +++ /dev/null @@ -1,98 +0,0 @@ ---- -layout: default ---- -
-
-
-
-
- {% include breadcrumbs.html %} -
- {% if page.logo %} -
- -
- {% endif %} -
- {% include pagenav.html %} - {% if page.tagline or page.temp_tagline %} -

{{ page.temp_tagline | default: page.tagline }}

- {% endif %} - {% if page.temp_blurb or page.blurb %} -
- {{ page.temp_blurb | default: page.blurb | markdownify }} -
- {% endif %} - {%- if page.buttons or page.website -%} -
-
- {%- for button in page.buttons -%} - {{button.label}} - {%- endfor -%} - {%- unless page.buttons -%} - Visit Website - {%- endunless -%} -
-
    - {%- if page.website and page.buttons -%} -
  • - {%- endif -%} - {%- if page.github -%} -
  • - {%- endif -%} - {%- if page.instagram -%} -
  • - {%- endif -%} - {%- if page.mastodon -%} -
  • - {%- endif -%} - {%- if page.twitter -%} -
  • - {%- endif -%} - {%- if page.facebook -%} -
  • - {%- endif -%} - {%- if page.reddit -%} -
  • - {%- endif -%} - {%- if page.meetup -%} -
  • - {%- endif -%} - {%- if page.youtube_page -%} -
  • - {%- endif -%} - {%- if page.slack_channel -%} -
  • - {%- endif -%} - {%- if page.email_list -%} -
  • - {%- endif -%} - {%- if page.donate -%} -
  • - {%- endif -%} -
-
- {%- endif -%} -
-
-
-
- {%- if page.image -%} -
- -
- {%- endif -%} -
-
- {%- assign content = page.content | strip_newlines -%} - {%- if content != '' -%} -
-
- {{- content -}} -
-
- {%- endif -%} - {%- include posts_section.html tag=page.title max_posts=page.max_posts -%} -
-
-
diff --git a/_layouts/redirect.html b/_layouts/redirect.html deleted file mode 100644 index 93a484c..0000000 --- a/_layouts/redirect.html +++ /dev/null @@ -1,9 +0,0 @@ ---- ---- - - - - - - - diff --git a/_layouts/session.html b/_layouts/session.html deleted file mode 100644 index 638d6c6..0000000 --- a/_layouts/session.html +++ /dev/null @@ -1,69 +0,0 @@ ---- -layout: default ---- -
- {% include cover.html %} -
-
- {% include breadcrumbs.html %} - {% include pagenav.html %} -
-
-
- {{content}} - {%- include register_button.html item=page -%} - {%- include load_event item=page -%} - {%- if event_is_past and page.youtube == nil and page.podbean==nil and page.video_src==nil -%} -

No recording is available from this session.

- {%- endif -%} - {%- if page.slides -%} -

View Slides

- {% endif %} -
- {% include load_people names=page.speaker %} - {%- if people.size > 0 -%} -
-
-

Speaker{%- if people.size != 1 -%}s{%- endif -%}

-
- {% include people_list.html people=people %} -
- {%- endif -%} - - {%- include tagged_pages_list.html -%} - - {%- assign talks=site.categories[page.categories.first] | where_exp: "item", "item != page" -%} - {%- if page.youtube or page.video_src or page.podbean -%} - {%- assign talks=talks | where_exp: "item", "item.youtube or item.video_src or item.podbean" -%} - {%- endif -%} - {%- assign newer_item=talks | reverse | find_exp: "item", "item.date > page.date" -%} - {%- assign older_item=talks | find_exp: "item", "item.date < page.date" -%} - - {%- unless older_item -%} - {%- assign older_item=talks | first -%} - {%- endunless -%} - - {%- unless newer_item -%} - {%- assign newer_item=talks | last -%} - {%- endunless -%} - - {%- if page.categories.first == "State of the Map US" or page.categories.first == "Mapping USA" -%} - {%- assign up_next_item=newer_item -%} - {%- assign prior_item=older_item -%} - {%- else -%} - {%- assign up_next_item=older_item -%} - {%- assign prior_item=newer_item -%} - {%- endif -%} -
-
-

Next up in {{page.categories.first}}

- Previous talk -
- {% assign as_array="" | split: "," | push: up_next_item %} - {% include item_list.html items=as_array %} -
- -
-
- -
diff --git a/_plugins/absolute-urls/Gemfile b/_plugins/absolute-urls/Gemfile deleted file mode 100644 index bb94df8..0000000 --- a/_plugins/absolute-urls/Gemfile +++ /dev/null @@ -1,4 +0,0 @@ -# frozen_string_literal: true - -source "https://rubygems.org" -gemspec diff --git a/_plugins/absolute-urls/absolute-urls.gemspec b/_plugins/absolute-urls/absolute-urls.gemspec deleted file mode 100644 index 87226e4..0000000 --- a/_plugins/absolute-urls/absolute-urls.gemspec +++ /dev/null @@ -1,16 +0,0 @@ -# frozen_string_literal: true - -Gem::Specification.new do |spec| - spec.name = "absolute-urls" - spec.version = "0.1.0" - spec.authors = ["Quincy Morgan"] - spec.email = ["2046746+quincylvania@users.noreply.github.com"] - - spec.summary = "Force absolute URLs in Jekyll Kramdown `href` and `src` properties." - spec.homepage = "https://github.com/osmus/dogwood" - spec.license = "MIT" - - spec.files = Dir["lib/**/*"] - - spec.add_runtime_dependency "jekyll", "~> 4.3" -end diff --git a/_plugins/absolute-urls/lib/absolute-urls.rb b/_plugins/absolute-urls/lib/absolute-urls.rb deleted file mode 100644 index 9585dd5..0000000 --- a/_plugins/absolute-urls/lib/absolute-urls.rb +++ /dev/null @@ -1,25 +0,0 @@ -# This plugin ensures all `src` and `href` properties created by markdown parsing -# are absolute links. This solves issues that occur when the baseurl is a subdirectory. - -require 'kramdown/utils/html' - -SITE_BASEURL = (Jekyll.sites()[0].config['url'] || '') + (Jekyll.sites()[0].config['baseurl'] || ''); - -module AbsoluteUrls - def html_attributes(attr) - - return super unless attr['src'] || attr['href'] - - if attr['src'] && attr['src'].start_with?("/") - attr['src'] = SITE_BASEURL + attr['src'] - end - - if attr['href'] && attr['href'].start_with?("/") - attr['href'] = SITE_BASEURL + attr['href'] - end - - super(attr) - end -end - -Kramdown::Utils::Html.prepend AbsoluteUrls \ No newline at end of file diff --git a/_plugins/post-aliases/Gemfile b/_plugins/post-aliases/Gemfile deleted file mode 100644 index bb94df8..0000000 --- a/_plugins/post-aliases/Gemfile +++ /dev/null @@ -1,4 +0,0 @@ -# frozen_string_literal: true - -source "https://rubygems.org" -gemspec diff --git a/_plugins/post-aliases/lib/post-aliases.rb b/_plugins/post-aliases/lib/post-aliases.rb deleted file mode 100644 index e6b992a..0000000 --- a/_plugins/post-aliases/lib/post-aliases.rb +++ /dev/null @@ -1,38 +0,0 @@ -# This plugin generates redirect pages for all posts, pointing from the /:year/:month/:title -# format to the actual URL, whatever it may be. This makes the site backwards-compatible -# for links to pre-2023-redesign blog posts. It could have other uses as well, like URL-shortening. -# -# Example: -# /2023/02/tasking-manager-redesign -# --> automatically redirects to --> -# /news/2023/02/tasking-manager-redesign - -module RedirectPosts - class RedirectPostsGenerator < Jekyll::Generator - safe true - - def generate(site) - site.posts.docs.each do |post| - site.pages << PostRedirectPage.new(site, post) - end - end - end -end - -class PostRedirectPage < Jekyll::Page - def initialize(site, post) - @site = site # the current site instance. - @base = site.source # path to the source directory. - - @basename = post.basename # filename without the extension. - @ext = post.data["ext"] # the extension. - @name = post.basename + post.data["ext"] # basically @basename + @ext. - - @data = {} - - data["layout"] = "redirect" - data["redirect"] = post.url - data["permalink"] = post.date.strftime('/%Y/%m/') + post.data["slug"] + "/" - - end -end \ No newline at end of file diff --git a/_plugins/post-aliases/post-aliases.gemspec b/_plugins/post-aliases/post-aliases.gemspec deleted file mode 100644 index c791e50..0000000 --- a/_plugins/post-aliases/post-aliases.gemspec +++ /dev/null @@ -1,16 +0,0 @@ -# frozen_string_literal: true - -Gem::Specification.new do |spec| - spec.name = "post-aliases" - spec.version = "0.1.0" - spec.authors = ["Quincy Morgan"] - spec.email = ["2046746+quincylvania@users.noreply.github.com"] - - spec.summary = "Create redirect pages for /:year/:month/:title to canonical posts." - spec.homepage = "https://github.com/osmus/dogwood" - spec.license = "MIT" - - spec.files = Dir["lib/**/*"] - - spec.add_runtime_dependency "jekyll", "~> 4.3" -end diff --git a/_plugins/unwrap-img/Gemfile b/_plugins/unwrap-img/Gemfile deleted file mode 100644 index bb94df8..0000000 --- a/_plugins/unwrap-img/Gemfile +++ /dev/null @@ -1,4 +0,0 @@ -# frozen_string_literal: true - -source "https://rubygems.org" -gemspec diff --git a/_plugins/unwrap-img/lib/unwrap-img.rb b/_plugins/unwrap-img/lib/unwrap-img.rb deleted file mode 100644 index 09b8644..0000000 --- a/_plugins/unwrap-img/lib/unwrap-img.rb +++ /dev/null @@ -1,31 +0,0 @@ -# This plugin unwrap elements wrapped in

elements, and adds an 'img-container' -# class to elements that wrap elements. This allows us to properly style images -# separately from

, e.g. to give them different widths. - -require 'kramdown/converter/html' - -BLANK_RE = /\A[[:space:]]*\z/ - -module StandaloneImages - def isImageElement(ele) - return ele.type == :img || (ele.type == :html_element && ele.value == "img") - end - def convert_p(el, indent) - return super unless el.children.any? {|child| isImageElement(child) } || el.children.all? { |child| child.type == :a } - # remove empty text elements that might be sandwiched between images - els = el.children.select { |child| child.type != :text || !BLANK_RE.match?(child.value) } - els = els.map { |child| - if child.children.size == 1 && isImageElement(child.children.first) - if child.attr['class'].nil? - child.attr['class'] = 'img-container' - else - child.attr['class'] = child.attr['class'] + ' img-container' - end - end - convert(child, indent) - } - return els.join('') - end -end - -Kramdown::Converter::Html.prepend StandaloneImages \ No newline at end of file diff --git a/_plugins/unwrap-img/unwrap-img.gemspec b/_plugins/unwrap-img/unwrap-img.gemspec deleted file mode 100644 index dcece94..0000000 --- a/_plugins/unwrap-img/unwrap-img.gemspec +++ /dev/null @@ -1,16 +0,0 @@ -# frozen_string_literal: true - -Gem::Specification.new do |spec| - spec.name = "unwrap-img" - spec.version = "0.1.0" - spec.authors = ["Quincy Morgan"] - spec.email = ["2046746+quincylvania@users.noreply.github.com"] - - spec.summary = "Unwrap Kramdown elements from

elements." - spec.homepage = "https://github.com/osmus/dogwood" - spec.license = "MIT" - - spec.files = Dir["lib/**/*"] - - spec.add_runtime_dependency "jekyll", "~> 4.3" -end diff --git a/_redirects/trees.md b/_redirects/trees.md deleted file mode 100644 index c25548b..0000000 --- a/_redirects/trees.md +++ /dev/null @@ -1,3 +0,0 @@ ---- -redirect: /plants/ ---- \ No newline at end of file diff --git a/_sass/dogwood/_base.scss b/_sass/dogwood/_base.scss deleted file mode 100644 index b39101b..0000000 --- a/_sass/dogwood/_base.scss +++ /dev/null @@ -1,45 +0,0 @@ -/* Reset ♥ - http://meyerweb.com/eric/tools/css/reset/ - v2.0 | 20110126 - License: none (public domain) -------------------------------------------------------- */ -html, body, div, span, applet, object, iframe, -h1, h2, h3, h4, h5, h6, p, blockquote, pre, -a, abbr, acronym, address, big, cite, code, -del, dfn, em, img, ins, kbd, q, s, samp, -small, strike, strong, sub, sup, tt, var, -b, u, i, center, -dl, dt, dd, ol, ul, li, -fieldset, form, label, legend, -table, caption, tbody, tfoot, thead, tr, th, td, -article, aside, canvas, details, embed, -figure, figcaption, footer, header, hgroup, -menu, nav, output, ruby, section, summary, -time, mark, audio, video { - margin:0; - padding:0; - border:0; - font-size:100%; - font:inherit; - vertical-align:baseline; - } -/* HTML5 display-role reset for older browsers */ -article, aside, details, figcaption, figure, -footer, header, hgroup, menu, nav, section { - display:block; -} -body { line-height:1; } -ol, ul { list-style:none; } -blockquote, q { quotes:none; } -blockquote:before, blockquote:after, -q:before, q:after { content:''; content:none; } -/* tables still need 'cellspacing="0"' in the markup */ -table { border-collapse: collapse; border-spacing:0; } -/* remember to define focus styles. Hee Haw */ -:focus { outline:0; } - -*, *:after, *:before { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} \ No newline at end of file diff --git a/_sass/dogwood/_layout.scss b/_sass/dogwood/_layout.scss deleted file mode 100644 index cb3eee2..0000000 --- a/_sass/dogwood/_layout.scss +++ /dev/null @@ -1,1599 +0,0 @@ -@use 'sass:color'; - -/* Inline Elements & Typography -------------------------------------------------------- */ -body { - background-color: $background-color; -} - -body, -input, -textarea { - color: $text-color; - font-size: $body-text-size; - line-height: 1.6667; - font-family: $sans-serif-font; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - font-variant-numeric: lining-nums; -} - -h1, h2, h3, h4, h5, h6 { - font-family: $serif-font; - margin: 0; - margin-bottom: $sp*0.5; - font-weight: 600; - line-height: 1.3; -} - -h1 { - font-weight: 700; - font-size: 32px; -} - -h2 { - font-size: 26px; -} - -h3 { - font-size: 22px; -} - -h4, h5 { - font-size: 18px; -} - -/* Links */ -a { - color: $primary-color; - text-decoration:none; -} -a:visited { - color: $primary-color; -} -a:hover, a:active { - color: lighten($primary-color, 10%); - - &:not(.button) { - text-decoration: underline; - } -} - -.dark { - background-color: $dark-background-color; - color: white; - a { - color: $primary-color-alt; - - &:hover, &:active { - color: lighten($primary-color-alt, 20%); - } - } - hr { - background: $dark-grid-color; - } -} - -abbr { - border-bottom:1px dotted #000; - cursor:help; -} - -address { font-style:italic;} -small { font-size:12px; line-height: 1.5;} -strong, b { font-weight:700;} -em, i { font-style:italic;} - -hr { - margin: 0 0 20px; - border: 0; - height: 1px; - background: $alpha-grid-color; -} - -/* Block Quotes */ -blockquote, q { - quotes:none; - font-style:italic; - padding-left:20px; - border-left: 10px solid #e8e8e8; - - &.pullquote > *:not(cite) { - font-size: 22px; - } -} - -blockquote:before, -blockquote:after, -q:before, -q:after { - content:''; -} - -/* Code Blocks & Pre */ -code, -pre { - padding: 5px 4px; - font-family: Menlo, Bitstream Vera Sans Mono, Monaco, Consolas, monospace; - font-size: 12px; - border-radius: 3px; -} -code { - padding:5px; - background: rgba(128,128,128,0.07); - border: 1px solid $grid-color; -} -pre { - display:block; - padding:10px; - word-break:break-all; - word-wrap:break-word; - white-space:pre; - white-space:pre-wrap; - background:#f8f8f8; - border:1px solid #ddd; - border-radius:3px; -} -pre code { - padding:0; - color:inherit; - background-color:transparent; - border:0; -} -.pre-scrollable { - max-height:300px; - overflow-y:scroll; -} - -/* sub/superscripts */ -sup, -sub { - height:0; - line-height:1; - vertical-align:baseline; - _vertical-align:bottom; - position:relative; - font-size:75%; -} -sup { - bottom:1em; -} - -label { - display: block; - font-weight: 600; - font-size: 0.9em; - cursor: pointer; -} -select, -textarea, -input[type=text], -input[type=email] { - display: inline-block; - width: 500px; - max-width: 100%; - vertical-align: middle; - padding: 4px 8px; - border-radius: 3px; - background-color:#fff; - border:1px solid $grid-color; -} -textarea:focus, -input[type=text]:focus, -input[type=email]:focus { - border-color: #70a177; -} - -textarea { - height:200px; - max-width:none; -} - -table { - width:100%; - background-color:transparent; - border-collapse:collapse; - border-spacing:0; - table-layout:fixed; -} -th, td { - padding: 4px 4px; - text-align: left; - vertical-align: top; - border-bottom: 1px solid $grid-color; -} -tr:first-child { - > th, > td { - border-top: 1px solid $grid-color; - } -} -th { - font-weight:bold; -} -thead th { - vertical-align:bottom; - color:#57594D; -} - -.iconsvg { - fill: currentColor; - display: inline-block; - vertical-align: middle; - width: 0.8em; - height: 0.8em; -} - -.iconsvg.pre-text { - margin-right: 0.2em; -} - -/* Layout -------------------------------------------------------- */ -.container { - position: relative; - width: 100%; - max-width: $container-width; - margin: 0 auto; - padding-right: $container-padding; - padding-left: $container-padding; - - .inner-container { - width: 100%; - max-width: 900px; - margin: 0 auto; - } - - &.stretch { - @media only screen and (max-width: $container-width) { - padding: 0; - .cover-image { - border-left: 0; - border-right: 0; - } - } - } -} -.layout-post:not(.has-image) article.content{ - padding-top: 0; -} -.layout-post.has-image article.content { - @media only screen and (max-width: $container-width) { - padding-top: 0; - .cover-image { - border-top: 0; - } - } -} - -form { - padding: $sp; - border: 1px solid #cfead3; - background: #f3fff5; - border-radius: 0 0 8px 8px; - border-top-width: 4px; - display: flex; - flex-direction: column; - align-items: baseline; - - > *:not(label):not(input[type='submit']) { - margin-bottom: $sp*0.5; - } - - input[type=submit] { - padding: 10px 30px; - margin-top: $sp*0.5; - } -} - -.bordered { - border: 1px solid $grid-color; -} - -/* Buttons -------------------------------------------------------- */ -button, a.button, input[type=submit] { - cursor: pointer; - display: inline-block; - font-weight: 600; - text-align: center; - -webkit-backdrop-filter: blur(10px); - backdrop-filter: blur(10px); - border: 0; - padding: 2px 8px; - border-radius: 6px; - - &:hover { - filter: brightness(1.1); - } - - &.bordered { - border: 1px solid $primary-color; - font-size: 0.95em; - - &:hover { - background: rgba(0, 0, 0, 0.05); - } - } - &.large { - padding: 10px 20px; - } - &.wide { - padding: 4px 24px; - } - &.white { - border-color: white; - color: white; - &:hover { - background: rgba(255, 255, 255, 0.1); - } - } - - &.prominent { - background-color: $primary-color; - color: white; - &:hover { - border-color: $primary-color-alt; - background: $primary-color-alt; - } - } - - &.external:after { - content: " "; - background-image: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20512%20512%22%20fill%3D%22%23fff%22%3E%3C!--!%20Font%20Awesome%20Free%206.4.2%20by%20%40fontawesome%20-%20https%3A%2F%2Ffontawesome.com%20License%20-%20https%3A%2F%2Ffontawesome.com%2Flicense%20(Commercial%20License)%20Copyright%202023%20Fonticons%2C%20Inc.%20--%3E%3Cpath%20d%3D%22M320%200c-17.7%200-32%2014.3-32%2032s14.3%2032%2032%2032h82.7L201.4%20265.4c-12.5%2012.5-12.5%2032.8%200%2045.3s32.8%2012.5%2045.3%200L448%20109.3V192c0%2017.7%2014.3%2032%2032%2032s32-14.3%2032-32V32c0-17.7-14.3-32-32-32H320zM80%2032C35.8%2032%200%2067.8%200%20112V432c0%2044.2%2035.8%2080%2080%2080H400c44.2%200%2080-35.8%2080-80V320c0-17.7-14.3-32-32-32s-32%2014.3-32%2032V432c0%208.8-7.2%2016-16%2016H80c-8.8%200-16-7.2-16-16V112c0-8.8%207.2-16%2016-16H192c17.7%200%2032-14.3%2032-32s-14.3-32-32-32H80z%22%2F%3E%3C%2Fsvg%3E'); - background-repeat: no-repeat; - display: inline-block; - height: 0.8em; - width: 0.8em; - margin-left: 0.3em; - } -} - -.site-wordmark { - display: flex; - align-items: center; - font-family: $serif-font; - font-weight: bold; - font-size: 21px; - white-space: nowrap; - - .logo { - height: 30px; - margin-right: $sp*0.25; - position: relative; - top: 2px; - } - - .text { - color: inherit; - } -} - - -/* Header -------------------------------------------------------- */ -.topbar { - position: fixed; - top: 0; - border-top: 5px solid $primary-color; - z-index: 10000; - background: $background-color; - width: 100%; - height: $topbar-height; - border-bottom: 1px solid $grid-color; - - .site-wordmark { - color: inherit; - } - - .container { - display: flex; - justify-content: space-between; - height: 100%; - } - - @media only screen and (max-width: $sections-width) { - position: relative; - height: $topbar-height*1.8; - .container { - flex-direction: column; - align-items: center; - padding-top: $sp*0.33333; - } - } -} - -.layout-body { - background: $background-color; - position: relative; - margin-top: $topbar-height; - - min-height: calc(100vh - $topbar-height - $footer-min-height); - - @media only screen and (max-width: $sections-width) { - margin-top: 0; - } -} - -ul.headernav { - display: flex; - flex-flow: row nowrap; - align-items: center; - height: 100%; - - > li { - flex: 0 1 100%; - font-size: 16px; - font-weight: 600; - white-space: nowrap; - height: 100%; - - display: flex; - align-items: center; - position: relative; - - &:last-child { - margin-left: $sp*0.5; - } - - a { - display: flex; - align-items: center; - } - - > a:not(.bordered) { - padding: 0 min($sp, 1.5vw); - color: $text-color; - height: 100%; - } - - ul.submenu { - display: none; - position: absolute; - top: 100%; - left: calc(min($sp, 1.5vw) - $sp*0.5); - background: white; - border: 1px solid $grid-color; - border-radius: 5px; - border-top-left-radius: 0; - box-shadow: 1px 1px 2px rgba(0,0,0,0.1); - - &::before { - content: " "; - background: white; - position: absolute; - left: 0; - top: -1px; - height: 1px; - width: 80px; - } - - a { - height: 100%; - width: 100%; - padding: $sp*0.25 $sp*0.5 $sp*0.5 $sp*0.5; - color: inherit; - font-weight: 400; - line-height: 1em; - } - } - /* don't show hover menu on touch taps */ - @media (hover: hover) { - &:hover { - ul.submenu { - display: block; - } - } - } - } -} - -body:not(.layout-post):not(.layout-session) { - .pagenav a { - color: inherit; - } -} - -.breadcrumbs, .pagenav { - width: 100%; - z-index: 1000; -} -.breadcrumbs, .pagenav ul { - font-size: 16px; - font-weight: 600; -} - -.breadcrumbs { - margin-bottom: $sp; - &:empty { - display: none; - } - .iconsvg { - margin-top: -2px; - } - a { - color: inherit; - } -} - -.pagenav { - display: flex; - align-items: baseline; - justify-content: space-between; - border-bottom: 1px solid $alpha-grid-color; - margin-bottom: $sp; - - .meta { - margin-bottom: $sp*0.5; - } - - > *:last-child { - margin-bottom: $sp*0.5; - } - - li { - display: inline; - white-space: nowrap; - &:not(:last-child) { - margin-right: 2vw; - } - } - - @media only screen and (max-width: $sections-width) { - flex-direction: column; - } -} -.layout-page.has-image { - .pagenav { - border-bottom: none; - margin-bottom: 0; - } -} -#hero-map { - width: 100%; - height: 50vw; - max-height: 70vh; - min-height: 30vh; - border-bottom: 1px solid $grid-color; - - .custom-marker { - background-color: var(--color); - border-radius: 50%; - width: 20px; - height: 20px; - cursor: pointer; - } - - .custom-marker::after { - position: absolute; - content: ''; - background-image: var(--icon-image); - background-position: center; - background-size: 70%; - background-repeat: no-repeat; - filter: invert(1); - width: 100%; - height: 100%; - border-radius: 50%; - } - - .custom-marker::before { - position: absolute; - content: ''; - width: 0px; - height: 0px; - bottom: -100%; - border: 10px solid transparent; - border-top: 17px solid var(--color); - } -} - -figcaption { - background-color: rgba(0,0,0,0.5); - -webkit-backdrop-filter: blur(10px); - backdrop-filter: blur(10px); - position: absolute; - right: 0; - bottom: 0; - max-width: min($text-width*0.8, 100%); - padding: calc($sp/6) calc($sp/4); - font-style: italic; - line-height: 1.3; - font-size: 0.9em; - color: white; - - a, a:visited { - color: #00e723; - } - a:hover, a:focus, a:active { - color: #00ff27; - } - - &.left { - right: initial; - left: 0; - } -} - -.cover { - color: white; - width: 100%; - position: relative; - background-position: center; - background-size: cover; - overflow-x: hidden; - - .pagenav { - border-bottom-color: rgba(255, 255, 255, 0.25); - } - - &.video { - background: black; - line-height: 0; - } - - .cover-image-container { - position: relative; - } - - .cover-image { - border: 1px solid $grid-color; - } - - .cover-image, .cover-video { - width: 100%; - max-height: min(70vh, 50vw); - height: $cover-image-height; - background-size: cover; - background-position: center; - background-repeat: no-repeat; - position: relative; - } - - figcaption { - right: 1px; - bottom: 1px; - max-width: min($text-width*0.8, calc(100%) - 2px); - } -} -.layout-project .cover, .layout-person .cover { - background: linear-gradient(-135deg, #002042, #022D48); -} - -iframe.embedded-page-viewer { - width: 100%; - height: calc(80vh - $topbar-height); - border: 1px solid $grid-color; - border-radius: 4px; - overflow: hidden; -} - -/* Project page --------------------------------------------- -*/ -$hero-overlap: 150px; - -.layout-project { - - .cover { - .logo-area { - display: flex; - - > * { - width: 100%; - } - - .logo-wrap { - flex: 0 0 auto; - width: $avatar-width; - max-height: $avatar-width*1.25; - margin-right: $sp*1.5; - text-align: center; - - img { - max-width: 100%; - max-height: 100%; - } - } - @media only screen and (max-width: $sections-width) { - flex-direction: column; - - .logo-wrap { - margin-right: 0; - margin-bottom: $sp; - } - - img.wordmark { - margin-top: 0; - } - } - } - a { - display: inline-block; - color: inherit; - } - > .container { - margin-top: $sp; - margin-bottom: $sp; - } - &.with-hero-image { - padding-bottom: $hero-overlap; - } - - .blurb a { - text-decoration: underline; - } - } - - img.wordmark { - max-width: 100%; - max-height: 86px; - } - - .blurb, .tagline { - max-width: $text-width; - } - - .cover .container .logo-area .right > *:not(:last-child) { - margin-bottom: $sp*0.5; - } - .tagline { - font-style: italic; - font-weight: bold; - font-size: 20px; - } - img.hero-image { - width: 100%; - border-radius: 5px; - border: 1px solid $alpha-grid-color; - margin-top: -$hero-overlap; - } - -} - -.buttons { - display: flex; - align-items: center; - justify-content: space-between; - margin-top: $sp; - - margin-bottom: -$sp; - - a { - margin-bottom: $sp; - } - .button { - flex: 0 0 auto; - } - .text-buttons > .button:not(:last-child) { - margin-right: $sp*0.75; - } - - @media only screen and (max-width: $sections-width) { - flex-direction: column; - align-items: baseline; - } -} -.banner-footer { - width: 100%; - padding-top: $sp; - position: relative; - color: #fff; -} -table.schedule { - table-layout: auto; - th, td { - padding: 10px 14px; - border-right: 1px solid $grid-color; - &:first-child { - border-left: 1px solid $grid-color; - } - } - td { - &:first-child { - width: 100px; - } - .title { - font-weight: 600; - } - } - - tr { - transition: 200ms ease-in-out; - } - - tr.interstitial { - background: hsl(0, 0%, 97%); - .title { - font-weight: normal; - font-style: italic; - } - } - - tr.ongoing { - border-top: 2px solid $status-color; - background: #E5F7FC; - td:first-child { - padding-top: 18px; - font-weight: 600; - position: relative; - - &:before { - content: "Happening Now"; - display: block; - position: absolute; - top: -14px; - border-radius: 13px; - background-color: $status-color; - color: white; - font-size: 14px; - font-weight: bold; - width: 124px; - height: 26px; - text-align: center; - left: -13px; - } - } - .title { - font-weight: bold; - } - } -} - -.icon-buttons { - display: flex; - flex-direction: row; - flex-wrap: wrap; - > li { - &:not(:last-child) { - margin-right: $sp*0.25; - } - } - .iconsvg { - vertical-align: middle; - height: 30px; - width: 30px; - } -} - -.section { - width: 100%; - .section-header { - border-bottom: 1px solid $alpha-grid-color; - margin-bottom: $sp; - display: flex; - align-items: baseline; - justify-content: space-between; - - h2, h3 { - white-space: nowrap; - } - } - a.section-button { - font-weight: 600; - } - margin-bottom: $sp; - - & > *:not(.prose) { - h1, h2, h3, h4, h5, h6 { - font-family: $serif-font !important; - } - } - &:empty { - display: none; - } -} - -/* Person page --------------------------------------------- -*/ -.layout-person { - $avatar-border-width: 5px; - - h1 { - margin: 0; - } - - .cover { - min-height: 200px; - } - - &.has-cover { - .cover { - background: none; - } - } - - .hero-avatar { - width: 100%; - padding-bottom: calc(100% - $avatar-border-width*2); - position: relative; - margin-top: -84px; - border: $avatar-border-width solid $background-color; - } - - .sections { - display: flex; - flex-direction: column; - } - .section { - width: auto; - display: flex; - justify-content: right; - margin: 0 auto; - - .section-body { - padding: $sp*0.75; - padding-left: 0; - border-bottom: 1px solid $grid-color; - - &.prose { - padding-bottom: 0; - } - } - - > h3 { - padding-top: $sp*0.75; - } - - > *:first-child { - width: 210px; - text-align: right; - padding-right: $sp*0.75; - } - > *:last-child { - width: $text-width; - max-width: 100%; - flex: 0 0 auto; - border-right: 1px solid $grid-color; - } - &:last-child > *:last-child { - border-bottom: 0; - } - - .name-header { - padding-top: 0; - } - } - .connect-links a:not(:last-child) { - margin-right: $sp; - } - - @media only screen and (max-width:$sections-width) { - .hero-avatar { - margin-left: auto; - margin-right: auto; - width: 210px; - height: 210px; - padding: 0; - } - .cover figcaption { - top: 1px; - bottom: initial; - } - .name-header { - text-align: center; - } - .sections { - padding-left: $sp*0.75; - } - .section { - flex-direction: column; - width: 100%; - - - > *:first-child { - width: 100%; - margin: 0 auto; - max-width: $text-width; - text-align: center; - } - > h3 { - border-right: 1px solid $grid-color; - } - > h3:empty { - display: none; - } - > *:last-child { - margin: 0 auto; - } - } - } -} - -.item-list { - position: relative; - - .item-listing { - display: flex; - justify-content: left; - max-width: 100%; - &:not(:last-child) { - margin-bottom: $sp; - } - - .listing-front { - max-width: 100%; - width: 360px; - position: relative; - flex: 0 0 auto; - - &:empty { - height: 0; - } - - .thumbnail-image { - position: relative; - width: 100%; - background-size: cover; - background-position: center; - background-repeat: no-repeat; - display: block; - border: 1px solid $alpha-grid-color; - - transition: transform 100ms ease-in-out; - - &:hover { - transform: scale(1.04); - z-index: 9999; - - .iconsvg { - opacity: 0.9; - } - } - - .iconsvg { - color: white; - opacity: 0.75; - width: 20px; - height: 20px; - position: absolute; - right: 10px; - bottom: 10px; - } - } - .rect-image { - border-radius: 2px; - height: $list-item-image-height; - } - } - - .listing-body { - padding-left: $sp; - max-width: $text-width; - - &:empty { - display: none; - } - &:first-child { - padding-left: 0; - } - - & > * { - margin-bottom: $sp*0.25; - } - .button { - margin-top: $sp*0.25; - } - .subtitle { - line-height: 1.2; - font-style: italic; - } - } - - &.contained-image { - .listing-front { - width: $avatar-width; - } - } - &.contained-image .thumbnail-image, - .thumbnail-image.contained-image { - height: $list-item-image-height; - background-size: contain; - border: 0; - } - - @media only screen and (max-width: $sections-width) { - flex-wrap: wrap; - .listing-front { - width: 100%; - } - .listing-body { - padding-left: 0; - padding-top: $sp*0.5; - } - } - } - - &.gallery { - display: flex; - flex-wrap: wrap; - .item-listing { - flex-direction: column; - align-items: center; - text-align: center; - width: $avatar-width; - flex: 0 0 auto; - - .listing-front { - width: 100%; - } - .thumbnail-image { - width: 80%; - padding-bottom: 80%; - margin: 0 auto; - } - - .listing-body { - padding: 0; - margin-top: $sp*0.5; - } - } - - @media only screen and (max-width: calc($avatar-width*2 + $container-padding*2)) { - &:not(.scroll) { - justify-content: center; - } - } - &:not(.pages-list):not(.people-list):not(.swag-list) { - - .item-listing { - width: calc($content-width * 0.333); - - align-items: baseline; - .listing-front .thumbnail-image { - width: 92%; - padding: 0; - } - - .listing-body { - width: 92%; - margin-left: auto; - margin-right: auto; - } - - h3 { - text-align: left; - } - } - - &.no-titles { - - .item-listing { - margin: 0; - .listing-front .thumbnail-image { - height: 196px; - width: 100%; - border-radius: 0; - border-width: 0.5px; - } - - } - } - - &.scroll { - .item-listing { - width: calc($content-width * 0.27); - .listing-front .thumbnail-image { - height: 148px; - } - } - .thumbnail-image, .listing-body { - margin-left: 0; - } - } - } - } - - &.people-list { - - .listing-front { - width: $avatar-width; - height: auto; - - .thumbnail-image { - width: 80%; - padding-bottom: 80%; - margin: 0 auto; - } - } - .listing-body { - padding-left: $sp*0.5; - } - } - - &.scroll { - flex-wrap: nowrap; - overflow-x: auto; - } - - &.swag-list { - h3 { - font-family: $sans-serif-font !important; - font-size: 1em; - } - } -} - -.simple-item-listing { - display: flex; - justify-content: space-between; - line-height: 1.25; - .date { - white-space: nowrap; - } - &:not(:last-child) { - margin-bottom: $sp*0.75; - } -} - -.title { - .iconsvg { - width: 0.6em; - height: 0.6em; - } -} - -.content { - padding-top: $sp; - padding-bottom: $sp*2; - width: 100%; -} - -article { - position: relative; - margin: auto; - display: flex; - flex-direction: column; - align-items: center; - - .post-header { - padding-top: $sp; - width: 100%; - margin: 0 auto; - position: relative; - } - .post-body { - margin-bottom: $sp*2; - } -} - -.prose { - display: flex; - flex-direction: column; - align-items: baseline; - position: relative; - z-index: 0; - - h2, h3, h4, h5, h6 { - font-family: $sans-serif-font; - } - - li { - list-style: disc; - margin-left: 20px; - } - ol { - li { - list-style: decimal; - } - } - - >, blockquote { - - .neatline { - position: absolute; - height: calc(100% + $sp); - width: calc(100% + $container-padding); - max-width: calc($text-width + $sp*2); - left: 0; - right: 0; - top: -$sp; - border-right: 1px solid $grid-color; - z-index: -1; - - @media only screen and (max-width: calc($text-width + $container-padding*2)) { - display: none; - } - } - - iframe, table, form, a, em, b, strong, i, p, ol, ul, - code, blockquote, q, h1, h2, h3, h4, h5, h6, hr, pre, center { - width: 100%; - max-width: $text-width; - margin-bottom: $sp; - } - img, figure, .img-container, div { - margin-bottom: $sp; - } - hr { - padding: 0; - width: 100%; - max-width: calc($text-width + $sp*2); - position: relative; - } - img, figure, .img-container, iframe, table { - max-width: $img-width; - border: 1px solid $grid-color; - background-color: $background-color; - padding: 0; - - &.wide { - max-width: 100%; - } - - @media only screen and (max-width: calc($img-width + $container-padding*2)) { - max-width: 100%; - } - } - figure, .img-container { - line-height: 0; - position: relative; - - img { - width: 100%; - } - } - blockquote, q { - position: relative; - left: 0.75em; - padding-left: $sp; - border-left: 6px solid $grid-color; - width: calc(100% - 1em); - max-width: calc($text-width - 1em); - } - } -} - -/* About -------------------------------------------------------- */ -.board-members img { - max-width: 50%; - margin: 0px auto 10px auto; - display: block; -} - -.board-members p { - margin-bottom: 40px; -} - - -/* Blog Post -------------------------------------------------------- */ - -.avatar { - background-image: url($baseurl + "/assets/avatar.jpg"); - background-color: white; - border-radius: 50%; - background-size: cover; - background-position: center; - flex: 0 0 auto; -} - -.inline-avatar { - display: inline-block; - vertical-align: text-top; - width: 24px; - height: 24px; - margin-right: 4px; -} - -/* 404 -------------------------------------------------------- */ -.notfound { - padding: 100px 100px; - text-align: center; - color: #999; - text-shadow: 1px 1px 2px #eee; - font-size: 25px; -} -.notfound h1 { - font-size: 50px; -} - -/* Footer -------------------------------------------------------- */ -.footer { - min-height: $footer-min-height; - font-size: 17px; - border-top: 1px solid rgb(60, 60, 60); - position: relative; - margin-top: 0px; - display: flex; - flex-flow: row nowrap; - padding: $sp 0; - - .top { - display: flex; - justify-content: space-between; - - @media only screen and (max-width: $sections-width) { - flex-direction: column; - - .site-wordmark { - margin-bottom: $sp; - } - } - } - - .sitemap { - display: flex; - flex-direction: row; - flex-wrap: wrap; - ul { - width: $avatar-width; - margin-bottom: $sp; - li { - white-space: nowrap; - - &:first-child { - font-weight: 600; - } - &:not(:last-child) { - margin-right: $sp*0.5; - } - } - } - a { - color: inherit; - } - } - - .smallprint { - display: flex; - justify-content: space-between; - } -} - -.status-bubble { - color: white; - background: $status-color; - border-radius: 20px; - position: absolute; - top: -10px; - font-weight: bold; - font-size: 0.75em; - padding: 0 $sp*0.5; -} - -.app-sign { - background-position: center; - background-size: cover; - border-radius: 16px; - border: 1px solid $grid-color; - height: 140px; - - .status-bubble { - top: -10px; - right: -10px; - } -} -.status-symbol { - color: $status-color; -} - -.hoverscale { - transition: transform 100ms ease-in-out; - - &:hover { - transform: scale(1.04); - z-index: 9999; - } -} - -.mono-logos { - img { - filter: brightness(0) invert(1); - } -} - -ul.org-members { - - padding-left: $sp*1.5; - - display: flex; - flex-wrap: wrap; - - li { - max-width: 100%; - list-style: none; - margin-left: 0; - margin-bottom: $sp; - &:not(:last-child) { - margin-right: $sp*2; - } - - img { - width: auto; - height: 100%; - max-width: 100%; - object-fit: contain; - } - } -} - -ul.org-members.level-5 li { - height: 70px; -} - -ul.org-members.level-4 li { - height: 80px; -} - -ul.org-members.level-3 li { - height: 90px; -} - -ul.org-members.level-2 li { - height: 100px; -} - -ul.org-members.level-1 li { - height: 108px; -} - -.directory { - display: flex; - flex-wrap: wrap; - .list-wrap { - flex-basis: 25%; - min-width: 200px; - padding-bottom: $sp; - padding-right: $sp*0.5; - white-space: nowrap; - } -} - -#notice-overlay { - position: fixed; - bottom: $sp*0.5; - right: $sp*0.5; - background: white; - border: 1px solid $grid-color; - border-radius: 4px; - padding: $sp*0.75 $sp*0.5; - box-shadow: 1px 1px 3px 1px rgba(0, 0, 0, 0.12); - - display: flex; - flex-direction: row; - - .logo { - width: 60px; - margin-right: $sp*0.5; - } - .status-bubble { - left: -10px; - } -} - -.cond-only { - display: none; -} -.condensed { - .no-cond { - display: none; - } -} -.condensed { - .cond-only { - display: initial; - } -} -.condensed { - .simple-item-listing > *:first-child { - display: flex; - flex-direction: column; - } -} -@media only screen and (max-width: $sections-width) { - .no-cond { - display: none !important; - } - .cond-only { - display: initial; - } - - .simple-item-listing > *:first-child { - display: flex; - flex-direction: column; - } -} \ No newline at end of file diff --git a/_sass/dogwood/initialize.scss b/_sass/dogwood/initialize.scss deleted file mode 100644 index ff620bd..0000000 --- a/_sass/dogwood/initialize.scss +++ /dev/null @@ -1,44 +0,0 @@ -@charset "UTF-8"; - -$sans-serif-font: Helvetica, Arial, sans-serif; -$serif-font: Georgia, serif; - -$background-color: white; -$primary-color: #22b663; -$primary-color-alt: #22b663; -$status-color: #930041; - -$grid-color: #dedede; -/* the below should look the same as the above when on a white bg */ -/* $alpha-grid-color: rgba(0, 0, 0, 0.13); */ -$alpha-grid-color: rgba(128, 128, 128, 0.26); -$text-color: #333; -$dark-background-color: #333; -$dark-grid-color: rgba(255, 255, 255, 0.13); - -$body-text-size: 18px; -$sp: 24px; -$container-width: 1100px; -$container-padding: $sp*0.75; -$content-width: calc($container-width - $container-padding * 2); -$cover-image-height: $container-width * 0.5; -$text-width: 700px; -$img-width: 880px; - -$footer-min-height: 490px; - -$topbar-height: 54px; - -$avatar-width: calc($content-width * 0.2); - -$sections-width: 720px; - -$list-item-image-height: 180px; - -// Import pre-styling-overrides hook and style-partials. -@import - "dogwood/custom-variables", // Hook to override predefined variables. - "dogwood/base", // Defines element resets. - "dogwood/layout", // Defines structure and style based on CSS selectors. - "dogwood/custom-styles" // Hook to override existing styles. -; diff --git a/_tools/embedded-page-cacher/index.js b/_tools/embedded-page-cacher/index.js deleted file mode 100644 index e6b9cdc..0000000 --- a/_tools/embedded-page-cacher/index.js +++ /dev/null @@ -1,139 +0,0 @@ -// embedded-page-cacher for dogwood -// -// This script saves local versions of remote pages linked -// in the `embedded_remote` property of `_posts`. Pages -// and their images are saved to `/embeds/cached/` with the -// full local URL saved to the `embedded` property. You can -// then use the `embedded-page` layout to display these pages -// in an iframe. -// -// This script is used on openstreetmap.us to cache our newsletters. -// Cacheing ensures the content will always be available, but also -// fixes cross-origin issues with iframes. For instance, we want -// clicked links to open in the browser window and not within the iframe. - -import fs from 'fs'; -import followRedirects from 'follow-redirects'; -const https = followRedirects.https; -import graymatter from 'gray-matter'; -import filenamifyUrl from 'filenamify-url'; - -import process from 'process'; -import minimist from 'minimist'; -const argv = minimist(process.argv.slice(2)); -let sourcePath = process.env.npm_config_srcdir || argv.srcdir || '.'; -if (sourcePath.endsWith('/')) sourcePath.slice(0, -1); - -const inDir = sourcePath + '/_posts'; -const outRelativeDir = '/embeds/cached' -const outDir = sourcePath + outRelativeDir; - -if (!fs.existsSync(outDir)) fs.mkdirSync(outDir); - -cacheRemoteLinks(inDir); - -function cacheRemoteLinks(path) { - - const dir = fs.opendirSync(path); - let dirent; - while ((dirent = dir.readSync()) !== null) { - const subpath = path + '/' + dirent.name; - if (dirent.isFile()) { - - const filedata = fs.readFileSync(subpath); - const frontmatter = graymatter(filedata); - - // ignore files not in Jekyll format - if (Object.keys(frontmatter.data).length > 0) { - let remoteUrl = frontmatter.data.embedded_remote; - if (remoteUrl) { - let slug = filenamifyUrl(remoteUrl); - let outPath = outDir + '/' + slug + '/'; - if (!fs.existsSync(outPath)) { - fs.mkdirSync(outPath); - cacheRemoteWebpage(remoteUrl, outPath); - - frontmatter.data.embedded = outRelativeDir + '/' + slug; - - let newFileContent = graymatter.stringify(frontmatter, frontmatter.data); - fs.writeFileSync(subpath, newFileContent); - console.log(`updated ${subpath}`); - } - } - } - } else if (dirent.isDirectory()) { - cacheRemoteLinks(subpath); - } - } - dir.closeSync(); -} - - -function cacheRemoteWebpage(url, toPath) { - console.log(url); - - var content = ""; - - var req = https.request(url, function(res) { - res.setEncoding("utf8"); - res.on("data", function (chunk) { - content += chunk; - }); - - res.on("end", function () { - content = content.trim() - // we want all links to open in new tabs instead of in the iframe - .replace('', ''); - - content = cacheRemoteImages(content, toPath); - - fs.writeFileSync(toPath + "index.html", content); - console.log(`cached ${url} to ${toPath}`); - }); - }); - - req.on('error', (e) => { - console.error(`problem with request: ${e.message}`); - }); - - req.end(); -} - -function cacheRemoteImage(url, toPath) { - - var content = ""; - - var req = https.request(url, function(res) { - res.setEncoding('binary'); - res.on("data", function (chunk) { - content += chunk; - }); - - res.on("end", function () { - fs.writeFileSync(toPath, content, "binary"); - console.log(`cached ${url} to ${toPath}`); - }); - }); - - req.on('error', (e) => { - console.error(`problem with request: ${e.message}`); - }); - - req.end(); -} - -function cacheRemoteImages(html, toPath) { - if (!fs.existsSync(toPath + "img/")){ - fs.mkdirSync(toPath + "img/"); - } - - let imgRegex = /src="(\S+?\.(?:png|jpg|jpeg|gif|svg|tif|tiff|pdf))\S*?"/gi; - const matches = html.matchAll(imgRegex); - for (const match of matches) { - let imgUrl = match[1]; - let slug = filenamifyUrl(imgUrl); - html = html.replaceAll(imgUrl, "img/" + slug); - cacheRemoteImage(imgUrl, toPath + "img/" + slug); - } - return html; -} diff --git a/_tools/frontmatter-validator/index.js b/_tools/frontmatter-validator/index.js deleted file mode 100644 index b687df2..0000000 --- a/_tools/frontmatter-validator/index.js +++ /dev/null @@ -1,97 +0,0 @@ -// frontmatter-validator for dogwood -// -// This script checks that the frontmatter in all your -// Jekyll documents matches a known format. This is important -// since the theme relies on many custom variables. -// -// By default, the script will throw an error if you have -// additional properties to those expected. This catches -// typos like `authors` instead of `author`. Use the -// `--strict=false` option to turn off this behavior. - -import fs from 'fs'; -import graymatter from 'gray-matter'; -import path from 'path'; -import {fileURLToPath} from 'url'; - -import process from 'process'; -import minimist from 'minimist'; -const argv = minimist(process.argv.slice(2)); -let sourcePath = process.env.npm_config_srcdir || argv.srcdir || '.'; -if (sourcePath.endsWith('/')) sourcePath.slice(0, -1); - -import ZSchema from 'z-schema'; - -let zSchemaOptions = {}; - -let isStrict = true; -if (("npm_config_strict" in process.env && !process.env.npm_config_strict) || - process.argv.includes("--strict=false")) { - isStrict = false; -} - -if (isStrict) { - let strictOptions = { - assumeAdditional: true, - forceItems: true, - forceMinItems: true, - forceMinLength: true, - forceProperties: true, - noEmptyArrays: true, - noEmptyStrings: true, - noExtraKeywords: true, - noTypeless: true, - }; - Object.assign(zSchemaOptions, strictOptions); -} - -const jsonValidator = new ZSchema(zSchemaOptions); - -let hasInvalid = false; - -function validateJson(json, schema) { - const valid = jsonValidator.validate(json, schema); - const errors = jsonValidator.getLastErrors(); - if (!valid) { - errors.forEach(function(error) { - console.log(error); - }); - hasInvalid = true; - } -} - -function validateFrontmatter(path, schemaPath) { - const schema = JSON.parse(fs.readFileSync(schemaPath)); - const dir = fs.opendirSync(path); - let dirent; - while ((dirent = dir.readSync()) !== null) { - const subpath = path + '/' + dirent.name; - if (dirent.isFile()) { - const filedata = fs.readFileSync(subpath); - const info = graymatter(filedata); - - // ignore files not in Jekyll format - if (Object.keys(info.data).length > 0) { - // parse to string and back again to make sure dates are in string format - let data = JSON.parse(JSON.stringify(info.data)); - validateJson(data, schema); - } - } else if (dirent.isDirectory()) { - validateFrontmatter(subpath, schemaPath); - } - } - dir.closeSync(); -} - -const directory = path.dirname(fileURLToPath(import.meta.url)); -var schemasDir = path.join(directory, '/schemas'); - -validateFrontmatter(sourcePath + '/_posts', schemasDir + '/post.json'); -validateFrontmatter(sourcePath + '/_people', schemasDir + '/person.json'); -validateFrontmatter(sourcePath + '/_pages', schemasDir + '/page.json'); -validateFrontmatter(sourcePath + '/_redirects', schemasDir + '/redirect.json'); - -if (hasInvalid) { - // nonzero exit for GitHub Actions - process.exit(1); -} \ No newline at end of file diff --git a/_tools/frontmatter-validator/schemas/page.json b/_tools/frontmatter-validator/schemas/page.json deleted file mode 100644 index 84cef98..0000000 --- a/_tools/frontmatter-validator/schemas/page.json +++ /dev/null @@ -1,281 +0,0 @@ -{ - "title": "Page", - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "temp_title": { - "type": "string" - }, - "short_title": { - "type": "string" - }, - "tagline": { - "type": "string" - }, - "temp_tagline": { - "type": "string" - }, - "blurb": { - "type": "string" - }, - "temp_blurb": { - "type": "string" - }, - "layout": { - "type": "string" - }, - "event": { - "type": "string" - }, - "event_series": { - "type": "string" - }, - "caption": { - "type": "string" - }, - "status": { - "type": "string" - }, - "location": { - "type": "string" - }, - "image": { - "type": "string" - }, - "sign": { - "type": "string" - }, - "logo": { - "type": "string" - }, - "wordmark": { - "type": "string" - }, - "icon": { - "type": "string" - }, - "website": { - "type": "string" - }, - "twitter": { - "type": "string" - }, - "youtube_page": { - "type": "string", - "description": "Path to a page on youtube.com. Different from `youtube` since that parameter is a video ID which is used differently." - }, - "facebook": { - "type": "string" - }, - "slack_channel": { - "type": "string" - }, - "instagram": { - "type": "string" - }, - "email_list": { - "type": "string" - }, - "meetup": { - "type": "string" - }, - "reddit": { - "type": "string" - }, - "mastodon": { - "type": "string" - }, - "donate": { - "type": "string" - }, - "links": { - "type": "array", - "items": { - "type": "object", - "properties": { - "label": { - "type": "string" - }, - "link": { - "type": "string" - } - } - } - }, - "swag_items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "url": { - "type": "string" - }, - "image": { - "type": "string" - } - } - } - }, - "swag_sections": { - "type": "array", - "items": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "url": { - "type": "string" - }, - "image": { - "type": "string" - } - } - } - } - } - } - }, - "dropdown_links": { - "type": "array", - "items": { - "type": "object", - "properties": { - "label": { - "type": "string" - }, - "link": { - "type": "string" - } - } - } - }, - "app_links": { - "type": "array", - "items": { - "type": "object", - "properties": { - "label": { - "type": "string" - }, - "link": { - "type": "string" - } - } - } - }, - "footer_links": { - "type": "array", - "items": { - "type": "object", - "properties": { - "label": { - "type": "string" - }, - "link": { - "type": "string" - } - } - } - }, - "buttons": { - "type": "array", - "items": { - "type": "object", - "properties": { - "label": { - "type": "string" - }, - "link": { - "type": "string" - } - } - } - }, - "sessions": { - "type": "array", - "items": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "blurb": { - "type": "string" - }, - "date": { - "oneOf": [ - { - "type": "string", - "format": "date-time" - }, - { - "type": "string", - "pattern": "\\d{4}-[01]\\d-[0-3]\\d [0-2]\\d:[0-5]\\d(:[0-5]\\d)? ([+-][0-2]\\d[0-5]\\d)" - } - ] - } - } - } - }, - "section_tags": { - "type": "array", - "items": { - "type": "string" - } - }, - "team_name": { - "type": "string" - }, - "max_posts": { - "type": "integer" - }, - "updated": { - "type": "string", - "format": "date-time" - }, - "timezone": { - "type": "string" - }, - "filter_start": { - "type": "string", - "format": "date-time" - }, - "filter_end": { - "type": "string", - "format": "date-time" - }, - "start": { - "type": "string", - "format": "date-time" - }, - "end": { - "type": "string", - "format": "date-time" - }, - "map": { - "type": "object", - "properties": { - "points": { - "type": "string" - } - } - } - }, - "required": [ - "title" - ] - } \ No newline at end of file diff --git a/_tools/frontmatter-validator/schemas/person.json b/_tools/frontmatter-validator/schemas/person.json deleted file mode 100644 index f2d0cda..0000000 --- a/_tools/frontmatter-validator/schemas/person.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "title": "Person", - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "updated": { - "type": "string", - "format": "date-time" - }, - "roles": { - "type": "array", - "items": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "at": { - "type": "string" - }, - "from": { - "type": "string", - "format": "date-time" - }, - "to": { - "type": "string", - "format": "date-time" - } - }, - "required": [ - "at" - ] - } - }, - "image": { - "type": "string" - }, - "image_remote": { - "type": "string" - }, - "cover": { - "type": "string" - }, - "caption": { - "type": "string" - }, - "linkedin": { - "type": "string" - }, - "twitter": { - "type": "string" - }, - "github": { - "type": "string" - }, - "osm": { - "type": "string" - }, - "website": { - "type": "string" - }, - "wikipedia": { - "type": "string" - }, - "mastodon": { - "type": "string" - }, - "medium": { - "type": "string" - } - }, - "required": [ - "title" - ] - } \ No newline at end of file diff --git a/_tools/frontmatter-validator/schemas/post.json b/_tools/frontmatter-validator/schemas/post.json deleted file mode 100644 index 7dbdbfe..0000000 --- a/_tools/frontmatter-validator/schemas/post.json +++ /dev/null @@ -1,113 +0,0 @@ -{ - "title": "session", - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "embedded": { - "type": "string" - }, - "embedded_remote": { - "type": "string" - }, - "permalink": { - "type": "string" - }, - "event": { - "type": "string" - }, - "blurb": { - "type": "string" - }, - "date": { - "oneOf": [ - { - "type": "string", - "format": "date-time" - }, - { - "type": "string", - "pattern": "\\d{4}-[01]\\d-[0-3]\\d [0-2]\\d:[0-5]\\d(:[0-5]\\d)? ([+-][0-2]\\d[0-5]\\d)" - } - ] - }, - "image": { - "type": "string" - }, - "image_remote": { - "type": "string" - }, - "caption": { - "type": "string" - }, - "youtube": { - "type": ["string", "null"] - }, - "video_src": { - "type": "string" - }, - "podbean": { - "type": "string" - }, - "register": { - "type": "string" - }, - "slides": { - "type": "string" - }, - "author": { - "oneOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ] - }, - "speaker": { - "oneOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ] - }, - "tags": { - "type": "array", - "items": { - "type": "string" - } - }, - "block": { - "type": "string" - }, - "time": { - "type": "string" - }, - "day": { - "type": "string" - }, - "room": { - "type": "string" - }, - "length": { - "type": "string" - }, - "type": { - "type": "string" - } - }, - "required": [ - "title" - ] - } \ No newline at end of file diff --git a/_tools/frontmatter-validator/schemas/redirect.json b/_tools/frontmatter-validator/schemas/redirect.json deleted file mode 100644 index 56113a8..0000000 --- a/_tools/frontmatter-validator/schemas/redirect.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "title": "Redirect", - "type": "object", - "properties": { - "permalink": { - "type": "string" - }, - "redirect": { - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "redirect" - ] - } \ No newline at end of file diff --git a/_tools/image-cacher/index.js b/_tools/image-cacher/index.js deleted file mode 100644 index ea0f598..0000000 --- a/_tools/image-cacher/index.js +++ /dev/null @@ -1,112 +0,0 @@ -// image-cacher for dogwood -// -// This script fetches remote images referenced in the `image` -// property of `_posts` and `_people` and saves them locally. -// Remote images are sometimes a convenience but they are liable -// to turn into 404s or 403s in time. -// -// Cached images are saved to `/img/posts/cached/` and /img/people/cached/`, -// the `image` property is changed to the local file, and the original `image` -// value is moved to `image_remote` for future reference. -// -// Remember to re-run the thumbnail-generator tool after cacheing images. - -import fs from 'fs'; -import followRedirects from 'follow-redirects'; -const https = followRedirects.https; -import graymatter from 'gray-matter'; - -import process from 'process'; -import minimist from 'minimist'; -const argv = minimist(process.argv.slice(2)); -let sourcePath = process.env.npm_config_srcdir || argv.srcdir || '.'; -if (sourcePath.endsWith('/')) sourcePath.slice(0, -1); - -const imgDir = 'img'; - -const imgKeys = ['image', 'cover']; - -processFiles('_people', 'people'); -processFiles('_posts', 'posts'); - -async function processFiles(jekyllSubdir, imageSubdir) { - let jekyllDirPath = sourcePath + "/" + jekyllSubdir; - const dir = fs.opendirSync(jekyllDirPath); - let dirent; - while ((dirent = dir.readSync()) !== null) { - const subpath = jekyllDirPath + '/' + dirent.name; - if (dirent.isFile()) { - const filedata = fs.readFileSync(subpath); - const info = graymatter(filedata); - - // ignore files not in Jekyll format - if (Object.keys(info.data).length > 0) { - let newFrontmatter = await cacheRemoteImages(info.data, imageSubdir); - if (newFrontmatter) { - let newFileContent = graymatter.stringify(info, newFrontmatter); - fs.writeFileSync(subpath, newFileContent); - console.log(`updated ${subpath}`); - } - } - } else if (dirent.isDirectory()) { - await processFiles(jekyllSubdir + '/' + dirent.name, imageSubdir); - } - } - dir.closeSync(); -} - -async function cacheRemoteImage(url, toPath) { - - return new Promise((resolve) => { - - var content = ""; - - var req = https.request(url, function(res) { - if (res.statusCode !== 200) { - console.error(`status ${res.statusCode} for ${url}`); - resolve(false); - return; - } - res.setEncoding('binary'); - res.on("data", function (chunk) { - content += chunk; - }); - - res.on("end", function () { - fs.writeFileSync(toPath, content, "binary"); - console.log(`cached ${url}`); - resolve(true); - }); - }); - - req.on('error', (e) => { - console.error(`problem with request: ${e.message}`); - resolve(false); - }); - - req.end(); - }); -} - -async function cacheRemoteImages(frontmatter, imageSubdir) { - - - var didCacheAny = false; - for (var i in imgKeys) { - var key = imgKeys[i]; - let imgUrl = frontmatter[key]; - if (imgUrl && imgUrl.startsWith('http')) { - let slug = encodeURIComponent(imgUrl); - frontmatter[key + "_remote"] = frontmatter[key]; - - var cachedDirPath = imgDir + '/' + imageSubdir + '/cached/'; - if (!fs.existsSync(sourcePath + "/" + cachedDirPath)) fs.mkdirSync(sourcePath + "/" + cachedDirPath); - - let relativeOutPath = '/' + cachedDirPath + slug; - frontmatter[key] = relativeOutPath; - var didCache = await cacheRemoteImage(imgUrl, sourcePath + relativeOutPath); - didCacheAny = didCacheAny || didCache; - } - } - if (didCache) return frontmatter; -} diff --git a/_tools/people-validator/index.js b/_tools/people-validator/index.js deleted file mode 100644 index 7a11cdd..0000000 --- a/_tools/people-validator/index.js +++ /dev/null @@ -1,106 +0,0 @@ -// people-validator for dogwood -// -// This script checks to make sure there is a document in the `_people` -// directory for every `author` and `speaker` referenced in your `_posts`. -// This isn't strictly necessary but it enables linking people with the -// various content they're associated with. -// -// Use the `--fix=true` option to automatically create missing files. -// Use the `--strict=false` option to output warnings instead of errors. -// -// Note that the name is the only unique identifier for a person. This -// means you can only reference one person for each unique name, -// and that different version of the name (Jim vs. Jimmy) will be -// treated as different people. - -import fs from 'fs'; -import graymatter from 'gray-matter'; - -import process from 'process'; -import minimist from 'minimist'; -const argv = minimist(process.argv.slice(2)); -let shouldFix = process.env.npm_config_fix || argv.fix; -let hasUnfixedIssue = false; - -let sourcePath = process.env.npm_config_srcdir || argv.srcdir || '.'; -if (sourcePath.endsWith('/')) sourcePath.slice(0, -1); - -let isStrict = true; -if (("npm_config_strict" in process.env && !process.env.npm_config_strict) || - process.argv.includes("--strict=false")) { - isStrict = false; -} - -let expectedPeople = {}; - -function recordPostData(data) { - let peopleKeys = ["author", "speaker"]; - peopleKeys.forEach(function(key) { - let value = data[key]; - if (typeof value === 'string') { - expectedPeople[value] = true; - } else if (Array.isArray(value)) { - value.forEach(function(item) { - if (typeof item === 'string') { - expectedPeople[item] = true; - } - }); - } - }); -} - -function processFiles(path) { - const dir = fs.opendirSync(path); - let dirent; - while ((dirent = dir.readSync()) !== null) { - const subpath = path + '/' + dirent.name; - if (dirent.isFile()) { - const filedata = fs.readFileSync(subpath); - const info = graymatter(filedata); - - // ignore files not in Jekyll format - if (Object.keys(info.data).length > 0) { - recordPostData(info.data); - } - } else if (dirent.isDirectory()) { - processFiles(subpath); - } - } - dir.closeSync(); -} - -function validatePeopleBasedOnPosts() { - let peopleList = Object.keys(expectedPeople).sort(); - peopleList.forEach(function(name) { - let slug = name.replaceAll(" ", "-").replaceAll(".", "").toLowerCase().normalize("NFD").replace(/\p{Diacritic}/gu, ""); - let path = sourcePath + '/_people/' + slug + '.md'; - if (!fs.existsSync(path)) { - // ignore groups - if (!name.match(/(Team|Committee|Organization|Staff|Board|Community|OpenStreetMap)/gi)) { - if (shouldFix) { - let newFileString = `---\ntitle: "${name}"\n---`; - fs.writeFileSync(path, newFileString); - console.log(`Created file for ${name} at ${path}`); - } else { - console.error(`Missing file for ${name} at ${path}`); - hasUnfixedIssue = true; - } - } - } else { - let personData = graymatter(fs.readFileSync(path)).data; - // the document title needs to match the name listed in the post meta or else Jekyll can't link them - if (personData.title !== name) { - console.error(`Unexpected name "${personData.title}" for ${name} at ${path}`); - hasUnfixedIssue = true; - } - } - }); -} - -processFiles(sourcePath + '/_posts'); -validatePeopleBasedOnPosts(); - -if (hasUnfixedIssue && isStrict) { - // nonzero exit for GitHub Actions - process.exit(1); -} \ No newline at end of file diff --git a/_tools/thumbnail-generator/index.js b/_tools/thumbnail-generator/index.js deleted file mode 100644 index c5b5c31..0000000 --- a/_tools/thumbnail-generator/index.js +++ /dev/null @@ -1,68 +0,0 @@ -// thumbnail-generator for dogwood -// -// This script creates thumbnail versions of images that are displayed -// at small sizes on some pages in order to reduce load times. -// It is hardcoded for special directories (it works recursively): -// /img/people/ – avatar images for people -// /img/posts/ – header images for posts -// And it saves the output to: -// /img-thumbnails/people/ -// /img-thumbnails/posts/ -// In your Jekyll documents you should specify images like -// "image: /img/posts/john.jpg" And the theme will automatically -// output "/img-thumbnails/posts/john.jpg" in places where smaller -// images are appropriate. -// -// Note that if you specify images in the special directories -// but do not run this script before building your site then -// your images will 404. - -import fs from 'fs'; -import sharp from 'sharp'; - -import process from 'process'; -import minimist from 'minimist'; -const argv = minimist(process.argv.slice(2)); -let sourcePath = process.env.npm_config_srcdir || argv.srcdir || '.'; -if (sourcePath.endsWith('/')) sourcePath.slice(0, -1); - -var imgDir = sourcePath + '/img/'; -var imgThumbDir = sourcePath + '/img-thumbnails/'; - -if (!fs.existsSync(imgThumbDir)) fs.mkdirSync(imgThumbDir); - -processFiles('posts', 720, null); -processFiles('people', 48, 48); - -function processFiles(subdir, width, height) { - let inDir = imgDir + subdir; - let outDir = imgThumbDir + subdir; - - if (!fs.existsSync(outDir)) fs.mkdirSync(outDir); - - const dir = fs.opendirSync(inDir); - let dirent; - while ((dirent = dir.readSync()) !== null) { - - //ignore hidden files - if (dirent.name[0] === '.') continue; - - if (dirent.isFile()) { - const subpath = inDir + '/' + dirent.name; - let outPath = outDir + '/' + dirent.name + '.webp'; - const buffer = fs.readFileSync(subpath); - - sharp(buffer, { animated: true, limitInputPixels: false }) - .resize(width, height, { withoutEnlargement: true }) - .toFile(outPath) - .catch(err => { - console.log("cannot create thumbnail for: " + subpath); - console.error(err); - }); - - } else if (dirent.isDirectory()) { - processFiles(subdir + '/' + dirent.name, width, height); - } - } - dir.closeSync(); -} diff --git a/assets/avatar.jpg b/assets/avatar.jpg deleted file mode 100644 index e7b4fe4bd8f11054f4924770f488f8398940927e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12663 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

?$*DaGgKoDH- zJd-|YU1EDJ012LZN3`=`MeYS1y#n_Lyhp$C1*2vHpW?|qQY|UO;$wXe^-cp+L72xO zGi6H9;`MK4x<77uI{!Th0R=WO@HGf_!mdjDz_J?`7#`Mo-I@$|?j><@Suod|;AB)J%^@8(&xKa+7&nK z`uHfvZDVUu-R?Bc^4)d%S7Hc{8wF1ibFDs0zlP7oGNS&bV?lq*LmK*oT6n6$wR*GC zhGq1V`s+%K6U3FJy;uue+F z0txe?M^qhE)m!N!#jN;p5Elj%Bi;sZQ-W*%G0b*!qD&PpmgV*czUW`yz0gtZuZ1Y> zC;y}hX@HsW2Uf8ctH$v)(8u%h5)JNGQYXRpm~NTZCc2Cw)eB54=mAbtlq=V%=!sWm zl~32+=Lk=c2_b!-%A1ypkAFjAzUhs>qYC_}67$O|%OUn@^Pd!qlipu2h&G(uf?Z`D z4z-O;Q@P+$oL$I_*USd~STwF&oqlJWD#aiw0olO?dzdgsf(446oV)ti61fz;r-ua) zJk42nI|N(++( z1$4XL1fCKTx=2i6cvc;3vSBN2o~$yfr;vAMt$k3`nt7g&`l0MTSMUjDeBji4XYzd% z6kTGW7k{+g9AVRob&&5 zz_T}rcp>V+y>vPhJ&#tO$;)>`pNk7W4PnTVPvDpLjSC5WN{mn8Vgz0n9iy)HaBz$z zC=L`{WeU!!N-f7rLR0!=&Oeal#TP-yhf%c6AEKil%p|J)zBB*P716cP zw&U|mq^ndh@8%Y3()CF#O^eg4dykTHFDA|lx6pj14Ji)m<#4;h4-*7!ne4Oi^P3?$ zX>&n`7KJ#BGSU-9k1?c11+uZ~bqMQ*3w)H}7rPJUAOJdl>Hx`KY&3$8RogASbQk2h zcBlIYmqn3+nU)ku*Lj~zgsd`?Y4_6c;#=kXjV}J@Vj)dS=IW)Zgzu6UG=krlEL~Yf z6g{6YGN$LC)DFs~xptpd_6Upn*$GYdc0#Sc!KedZ|F57C_1?)b^tq(uIBGKIsqn1u zjax~+f{LMPwjV4~kp_W@SE0Bp(s}f@rV3GC_m2{ZenHs4lWk~|8X4ve2S(E~g!dOT zQqHjO#fz7Qk@`Qlk+AQDXGN8a3Ae-q8&UoB9|htXxqsRH<<5Jvb~Pib1jBreQO?88x>Yul|+1J}__sT5p zmOt-|N%Dh?k{eZLD)3bZ-F^t9^DkHj_~Ws09uN8&CZScTtZ7>92-Rp(s#djaiTYjN zI-^-ILW;qg+Lfi~Xmd?6*z2dP_-O=w1D?NVgA_R%Ldb>Rj;2O28I!h+4PBCFQGL{u zG!G1GOm5Vnoslf?M^tA+uDhwEfYup*vj3;|6DOQbnvliXu+-2Y&8ON-67u)w3` zIf(|N-2z0|_zA6SQ6q?o9>#nU}qVWEQS;wpSX5+IaSCTzyiny zIF#V;U%L1mTfd|sw1sZ64e~4W|bH4 zkSnp7nlDD-M2Nofo$;#!A7dfCY^N1Hbn-oxeQn~yh43sqNXc^N7_8ZZ(XItei29g0**S`aXUlfj=QA~&PZv3i9jjC&K zUQuqQRKIi1BG>&%@ZP{h4(R5qcA}U6eNGSnPS1Am%C^m`xR{u&B_ga--k)3Ma~7J^ z-lrsFlb0m>!NV@%(cfhS+BA``V^<*+&PFaU}sOrRY3@<-xVo!v{79DeBQKbVh#TE-4gb&;Og)WYqIOaXsPJ|ZxPX14rEY>!`IPrc* zVAWzSvNVP)td7Va-q|>*0dv3L{+6%kK9&vr*I4$&0;c|LiDB`)>K1N-Rv|`7wVWVE Z;Zx5FUD}dIbYpxWcj3_3;2$jQ|9`%Cu4MoK diff --git a/assets/style.scss b/assets/style.scss deleted file mode 100644 index d3fd0ef..0000000 --- a/assets/style.scss +++ /dev/null @@ -1,5 +0,0 @@ ---- ---- -$baseurl: "{{site.url}}{{site.baseurl}}"; - -@import "dogwood/initialize"; \ No newline at end of file diff --git a/dogwood.gemspec b/dogwood.gemspec deleted file mode 100644 index 7814252..0000000 --- a/dogwood.gemspec +++ /dev/null @@ -1,25 +0,0 @@ -# frozen_string_literal: true - -Gem::Specification.new do |spec| - spec.name = "osmus-dogwood" - spec.version = "0.1.0" - spec.authors = ["Quincy Morgan"] - spec.email = ["2046746+quincylvania@users.noreply.github.com"] - - spec.summary = "The Jekyll theme powering openstreetmap.us" - spec.homepage = "https://github.com/osmus/dogwood" - spec.license = "MIT" - - spec.files = `git ls-files -z`.split("\x0").select do|f| - f.match(%r!^((assets|_includes|_plugins|_layouts|_sass)/|_config.yml|index.html|(LICENSE|README)((\.(txt|md|markdown)|$)))!i) - end - - spec.add_runtime_dependency "jekyll", "~> 4.3" - - spec.add_runtime_dependency "jekyll-archives", "~> 2.2.1" - spec.add_runtime_dependency 'jekyll-include-cache', "~> 0.2.1" - - spec.add_runtime_dependency "absolute-urls" - spec.add_runtime_dependency "post-aliases" - spec.add_runtime_dependency "unwrap-img" -end From 5f9b3fb6bad02ea67e2e9cd60b22cda21dc3bf91 Mon Sep 17 00:00:00 2001 From: Jacob Hall Date: Sun, 9 Jun 2024 01:05:44 -0600 Subject: [PATCH 2/8] add dogwood submodule --- .gitmodules | 3 +++ dogwood | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 dogwood diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..2248b3d --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "dogwood"] + path = dogwood + url = git@github.com:osmus/dogwood.git diff --git a/dogwood b/dogwood new file mode 160000 index 0000000..6b90193 --- /dev/null +++ b/dogwood @@ -0,0 +1 @@ +Subproject commit 6b90193942f448bf92a9dd83c60ece0cb4f4c205 From e686536ca5cc3b2e58510637acb9e718a97537c4 Mon Sep 17 00:00:00 2001 From: Jacob Hall Date: Sun, 9 Jun 2024 01:06:31 -0600 Subject: [PATCH 3/8] update Gemfile to load dogwood theme from submodule - to be honest, I copied this verbatim from my MapRVA/maprva.github.io repo (of the same license), perhaps it could be streamlined --- Gemfile | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/Gemfile b/Gemfile index e8bef19..f61e706 100644 --- a/Gemfile +++ b/Gemfile @@ -1,10 +1,17 @@ -# frozen_string_literal: true - source "https://rubygems.org" -# these gems aren't published so we need to tell ruby where they're located -gem "absolute-urls", path: "_plugins/absolute-urls" -gem "post-aliases", path: "_plugins/post-aliases" -gem "unwrap-img", path: "_plugins/unwrap-img" +gem "rake" + +gem "jekyll", "~> 4.3.3" + +group :jekyll_plugins do + gem "jekyll-feed", "~> 0.12" +end + +# theme +gem "osmus-dogwood", path: "dogwood" -gemspec \ No newline at end of file +# theme plugins +gem "absolute-urls", path: "./dogwood/_plugins/absolute-urls" +gem "post-aliases", path: "./dogwood/_plugins/post-aliases" +gem "unwrap-img", path: "./dogwood/_plugins/unwrap-img" From e59148d82d3dc81e946901cae2eebe538f69eb9d Mon Sep 17 00:00:00 2001 From: Jacob Hall Date: Sun, 9 Jun 2024 01:25:25 -0600 Subject: [PATCH 4/8] add dogwood theme to _config.yml --- _config.yml | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/_config.yml b/_config.yml index e2a765c..80b0df0 100644 --- a/_config.yml +++ b/_config.yml @@ -25,23 +25,12 @@ links: - link: /events label: Missing Maps Events a_class: button bordered + +# Build settings +theme: osmus-dogwood plugins: - - jekyll-archives - - jekyll-include-cache -jekyll-archives: - enabled: - - tags - - month - - year - layouts: - tag: archives/posts-tag - year: archives/posts-year - month: archives/month - permalinks: - tag: '/tags/:name/' - month: '/:year/:month/' - year: '/:year/' -date_format: "%b %e, %Y" + - jekyll-feed + collections: feeds: output: true @@ -81,4 +70,4 @@ defaults: values: permalink: /blog/:year/:month/:title/ category: "Blog" - layout: "post" \ No newline at end of file + layout: "post" From 6a7740d1c14f2584804bd447103a88aa5b352268 Mon Sep 17 00:00:00 2001 From: Jacob Hall Date: Sun, 9 Jun 2024 01:30:40 -0600 Subject: [PATCH 5/8] (temporary fix) set mono logo to regular logo file - I didn't see a mono logo available in this repo for Missing Maps, so I set the regular one to be the mono one too in _config.yml so that the default dogwood one wouldn't display. --- _config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_config.yml b/_config.yml index 80b0df0..8780cff 100644 --- a/_config.yml +++ b/_config.yml @@ -4,7 +4,7 @@ permalink: /:title/ # Include "future" posts so that upcoming events will display. Posts cannot be scheduled to automatically # publish at a certain time with Jekyll alone. logo: /img/MM_white_typography.svg -# logo_mono: /img/logo-mono.svg +logo_mono: /img/MM_white_typography.svg future: true # timezone: America/New_York # github: osmus/dogwood From 97c28292923c653541fbef76b4dae77850498187 Mon Sep 17 00:00:00 2001 From: Jacob Hall Date: Sun, 9 Jun 2024 01:33:27 -0600 Subject: [PATCH 6/8] set custom SASS variables to recreate original theme --- _sass/dogwood/custom-variables.scss | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/_sass/dogwood/custom-variables.scss b/_sass/dogwood/custom-variables.scss index 2a2d0fa..59ea803 100644 --- a/_sass/dogwood/custom-variables.scss +++ b/_sass/dogwood/custom-variables.scss @@ -1 +1,5 @@ -// Placeholder to allow overriding predefined variables smoothly. +$background-color: white; +$primary-color: #22b663; +$primary-color-alt: #22b663; +$status-color: #930041; + From a026a2d169e4687ff73a95aff20538f2cf9a95a4 Mon Sep 17 00:00:00 2001 From: Jacob Hall Date: Sun, 9 Jun 2024 01:35:04 -0600 Subject: [PATCH 7/8] set mastodon value to false in _config.yml - this prevents the dogwood theme from displaying the icon in the first place --- _config.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/_config.yml b/_config.yml index 8780cff..5902ab7 100644 --- a/_config.yml +++ b/_config.yml @@ -7,8 +7,7 @@ logo: /img/MM_white_typography.svg logo_mono: /img/MM_white_typography.svg future: true # timezone: America/New_York -# github: osmus/dogwood -# mastodon: https://en.osm.town/@OpenStreetMapUS +mastodon: false twitter: TheMissingMaps youtube_page: c/themissingmaps facebook: TheMissingMaps From 84eb51cfcb7e5138ea84d7025f3e571f600c7e79 Mon Sep 17 00:00:00 2001 From: Jacob Hall Date: Sun, 9 Jun 2024 01:37:57 -0600 Subject: [PATCH 8/8] checkout git submodules during deployment workflow - also, bump version of configure-pages Action --- .github/workflows/jekyll.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/jekyll.yml b/.github/workflows/jekyll.yml index 68520b5..94c923c 100644 --- a/.github/workflows/jekyll.yml +++ b/.github/workflows/jekyll.yml @@ -33,6 +33,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 + with: + submodules: recursive - name: Setup Ruby uses: ruby/setup-ruby@8575951200e472d5f2d95c625da0c7bec8217c42 # v1.161.0 with: @@ -41,7 +43,7 @@ jobs: cache-version: 0 # Increment this number if you need to re-download cached gems - name: Setup Pages id: pages - uses: actions/configure-pages@v5 + uses: actions/configure-pages@v4 - name: Build with Jekyll # Outputs to the './_site' directory by default run: bundle exec jekyll build --baseurl "${{ steps.pages.outputs.base_path }}"