From 4e145930c0a58af53107080efb5b2159122cdbc9 Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Mon, 17 Jun 2024 14:14:29 +0200 Subject: [PATCH 01/26] add alternate widget feed --- _plugins/feeds.rb | 44 ++++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/_plugins/feeds.rb b/_plugins/feeds.rb index bcfa54ac3a113e..0c4d80ec52c23e 100644 --- a/_plugins/feeds.rb +++ b/_plugins/feeds.rb @@ -27,6 +27,29 @@ def collapse_date_pretty(event) end end +def serialise(site, feed_path, builder) + # The builder won't let you add a processing instruction, so we have to + # serialise it to a string and then parse it again. Ridiculous. + + # First the 'default' with explanatory portion + finalised = Nokogiri::XML builder.to_xml + pi = Nokogiri::XML::ProcessingInstruction.new( + finalised, 'xml-stylesheet', + %(type="text/xml" href="#{site.config['url']}#{site.baseurl}/feed.xslt.xml") + ) + finalised.root.add_previous_sibling pi + File.write(feed_path, finalised.to_xml) + + # Then the widget-compatible version with a more minimal representation: + finalised = Nokogiri::XML builder.to_xml + pi = Nokogiri::XML::ProcessingInstruction.new( + finalised, 'xml-stylesheet', + %(type="text/xml" href="#{site.config['url']}#{site.baseurl}/feed-widget.xslt.xml") + ) + finalised.root.add_previous_sibling pi + File.write(feed_path.gsub(/\.xml$/, '.w.xml'), finalised.to_xml) +end + def generate_topic_feeds(site) TopicFilter.list_topics(site).each do |topic| feed_path = File.join(site.dest, 'topics', topic, 'feed.xml') @@ -56,6 +79,7 @@ def generate_topic_feeds(site) # Set generator also needs a URI attribute xml.generator('Jekyll', uri: 'https://jekyllrb.com/') xml.link(href: "#{site.config['url']}#{site.baseurl}/topics/#{topic}/feed.xml", rel: 'self') + xml.link(rel: 'alternate', href: "#{site.config['url']}#{site.baseurl}/topics/#{topic}/", rel: 'self') xml.updated(Gtn::ModificationTimes.obtain_time(topic_pages.first.path).to_datetime.rfc3339) xml.id("#{site.config['url']}#{site.baseurl}/topics/#{topic}/feed.xml") topic_title = site.data[topic]['title'] @@ -103,15 +127,7 @@ def generate_topic_feeds(site) end end - # The builder won't let you add a processing instruction, so we have to - # serialise it to a string and then parse it again. Ridiculous. - finalised = Nokogiri::XML builder.to_xml - pi = Nokogiri::XML::ProcessingInstruction.new( - finalised, 'xml-stylesheet', - %(type="text/xml" href="#{site.config['url']}#{site.baseurl}/feed.xslt.xml") - ) - finalised.root.add_previous_sibling pi - File.write(feed_path, finalised.to_xml) + serialise(site, feed_path, builder) end nil @@ -328,15 +344,7 @@ def generate_matrix_feed(site, mats, group_by: 'day', filter_by: nil) end end - # The builder won't let you add a processing instruction, so we have to - # serialise it to a string and then parse it again. Ridiculous. - finalised = Nokogiri::XML builder.to_xml - pi = Nokogiri::XML::ProcessingInstruction.new( - finalised, 'xml-stylesheet', - %(type="text/xml" href="#{site.config['url']}#{site.baseurl}/feed-html.xslt.xml") - ) - finalised.root.add_previous_sibling pi - File.write(feed_path, finalised.to_xml) + serialise(site, feed_path, builder) end def generate_event_feeds(site) From 42bf5828702faf4c15e9583d351c56535a79fb6b Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Mon, 17 Jun 2024 14:14:42 +0200 Subject: [PATCH 02/26] add widget feed styling --- feed-widget.xslt.xml | 101 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 feed-widget.xslt.xml diff --git a/feed-widget.xslt.xml b/feed-widget.xslt.xml new file mode 100644 index 00000000000000..53d4c2f85a3390 --- /dev/null +++ b/feed-widget.xslt.xml @@ -0,0 +1,101 @@ + + + + + + + + GTN News Widget • <xsl:value-of select="atom:feed/atom:title"/> + + + +
+ + GTN News + + • + + + + + + +
+
+ +
+
+ © GTN + • + CC-BY 4.0 + • + +
+ + +
+ + + + + + +
+

+ + + + + + +

+

+ + + + + + , + + +

+ + + +

+ +

+
+ +

+ +

+
+
+ +
+
+
From 4f070b0b9a1cbcd2cc2cab41baa38b43f2d795b4 Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Mon, 17 Jun 2024 14:15:38 +0200 Subject: [PATCH 03/26] add util page --- utils/widgets.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 utils/widgets.md diff --git a/utils/widgets.md b/utils/widgets.md new file mode 100644 index 00000000000000..e84d8e9c5ef330 --- /dev/null +++ b/utils/widgets.md @@ -0,0 +1,19 @@ +--- +layout: page +title: GTN Widgets +--- + +Embeddable RSS feed widget: + + + + + + + +These are easily embedded, note the `.w.xml` ending, indicating a widget. (This is simply used to provide an alternate XSLT that renders better in an `iframe`. + +```html + + +``` From 6bfb1c3e81cf534a87eb5e6071c7fbbbdbecb3a9 Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Mon, 17 Jun 2024 14:25:21 +0200 Subject: [PATCH 04/26] last one --- _plugins/feeds.rb | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/_plugins/feeds.rb b/_plugins/feeds.rb index 0c4d80ec52c23e..679299b1a4a707 100644 --- a/_plugins/feeds.rb +++ b/_plugins/feeds.rb @@ -427,15 +427,7 @@ def generate_event_feeds(site) end end - # The builder won't let you add a processing instruction, so we have to - # serialise it to a string and then parse it again. Ridiculous. - finalised = Nokogiri::XML builder.to_xml - pi = Nokogiri::XML::ProcessingInstruction.new( - finalised, 'xml-stylesheet', - %(type="text/xml" href="#{site.config['url']}#{site.baseurl}/feed.xslt.xml") - ) - finalised.root.add_previous_sibling pi - File.write(feed_path, finalised.to_xml) + serialise(site, feed_path, builder) end # Basically like `PageWithoutAFile` From 25eedece6bb45b51be2075b7b331e41ba88d7bf0 Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Mon, 17 Jun 2024 14:31:10 +0200 Subject: [PATCH 05/26] fix logo --- assets/images/GTN-400px.png | Bin 0 -> 21982 bytes assets/images/GTN-60px.png | Bin 5229 -> 3043 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/images/GTN-400px.png diff --git a/assets/images/GTN-400px.png b/assets/images/GTN-400px.png new file mode 100644 index 0000000000000000000000000000000000000000..cd6c32ce02cdb2a5be7935ba9d27b62bd1175216 GIT binary patch literal 21982 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

T58kRZ#_tSCY0D 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 literal 0 HcmV?d00001 diff --git a/assets/images/GTN-60px.png b/assets/images/GTN-60px.png index 111a7ad358035f12e3df86d6c2815ab5d0ecf1e3..2162f76fab526861b5a0375b2de7d70566e3ebf4 100644 GIT binary patch literal 3043 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 K1QT!FL;nlh6p~K> literal 5229 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 Date: Mon, 17 Jun 2024 14:31:21 +0200 Subject: [PATCH 06/26] use logo in feed --- _plugins/feeds.rb | 4 ++-- feed-widget.xslt.xml | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/_plugins/feeds.rb b/_plugins/feeds.rb index 679299b1a4a707..07858adb1512ec 100644 --- a/_plugins/feeds.rb +++ b/_plugins/feeds.rb @@ -83,7 +83,7 @@ def generate_topic_feeds(site) xml.updated(Gtn::ModificationTimes.obtain_time(topic_pages.first.path).to_datetime.rfc3339) xml.id("#{site.config['url']}#{site.baseurl}/topics/#{topic}/feed.xml") topic_title = site.data[topic]['title'] - xml.title("Galaxy Training Network - #{topic_title}") + xml.title("GTN - #{topic_title}") xml.subtitle("Recently added tutorials, slides, and FAQs in the #{topic} topic") topic_pages.each do |page| @@ -373,7 +373,7 @@ def generate_event_feeds(site) xml.link(href: "#{site.config['url']}#{site.baseurl}/events/feed.xml", rel: 'self') xml.updated(updated.to_datetime.rfc3339) xml.id("#{site.config['url']}#{site.baseurl}/events/feed.xml") - xml.title('Galaxy Training Network - Events') + xml.title('GTN - Events') xml.subtitle('Events in the Inter-Galactic Network') events.each do |page| diff --git a/feed-widget.xslt.xml b/feed-widget.xslt.xml index 53d4c2f85a3390..b0ef418e14a252 100644 --- a/feed-widget.xslt.xml +++ b/feed-widget.xslt.xml @@ -12,15 +12,14 @@ GTN News Widget • <xsl:value-of select="atom:feed/atom:title"/>

- GTN News + - • From 5c998128cc60a21a0ddbb4966d98ab23daf01930 Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Tue, 18 Jun 2024 09:53:20 +0200 Subject: [PATCH 07/26] improve feeds --- _plugins/feeds.rb | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/_plugins/feeds.rb b/_plugins/feeds.rb index 07858adb1512ec..f319fea1807fd2 100644 --- a/_plugins/feeds.rb +++ b/_plugins/feeds.rb @@ -50,6 +50,12 @@ def serialise(site, feed_path, builder) File.write(feed_path.gsub(/\.xml$/, '.w.xml'), finalised.to_xml) end +def markdownify(site, text) + site.find_converter_instance( + Jekyll::Converters::Markdown + ).convert(text.to_s) +end + def generate_topic_feeds(site) TopicFilter.list_topics(site).each do |topic| feed_path = File.join(site.dest, 'topics', topic, 'feed.xml') @@ -83,7 +89,7 @@ def generate_topic_feeds(site) xml.updated(Gtn::ModificationTimes.obtain_time(topic_pages.first.path).to_datetime.rfc3339) xml.id("#{site.config['url']}#{site.baseurl}/topics/#{topic}/feed.xml") topic_title = site.data[topic]['title'] - xml.title("GTN - #{topic_title}") + xml.title("#{topic_title}") xml.subtitle("Recently added tutorials, slides, and FAQs in the #{topic} topic") topic_pages.each do |page| @@ -97,7 +103,7 @@ def generate_topic_feeds(site) xml.title(page.data['title']) link = "#{site.config['url']}#{site.baseurl}#{page.url}" xml.link(href: link) - # Our links are stable + # Our links are (mostly) stable xml.id(link) # This is a feed of only NEW tutorials, so we only include publication times. @@ -106,8 +112,13 @@ def generate_topic_feeds(site) # xml.path(page.path) xml.category(term: "new #{page_type}") + xml.category(term: "#{page_type}") # xml.content(page.content, type: "html") - xml.summary(page.content.strip.split("\n").first, type: 'html') + + md = page.content[0..page.content.index("\n")].strip + html = markdownify(site, md) + text = Nokogiri::HTML(html).text + xml.summary(text) Gtn::Contributors.get_authors(page.data).each do |c| xml.author do @@ -155,7 +166,7 @@ def all_date_sorted_materials(site) [Gtn::PublicationTimes.obtain_time(t.path).to_datetime, 'tutorials', t, tags] end - bucket += m.fetch('ref_tutorials', []).reject { |s| s.url =~ /-plain.html/ }.map do |s| + bucket += m.fetch('ref_slides', []).reject { |s| s.url =~ /-plain.html/ }.map do |s| [Gtn::PublicationTimes.obtain_time(s.path).to_datetime, 'slides', s, tags] end end @@ -255,7 +266,7 @@ def generate_matrix_feed(site, mats, group_by: 'day', filter_by: nil) # convert '2024-01-01' to date xml.updated(DateTime.now.rfc3339) xml.id("#{site.config['url']}#{site.baseurl}/#{path}") - title_parts = ['GTN', filter_title, "#{lookup[group_by]} Updates"].compact + title_parts = [filter_title, "#{lookup[group_by]} Updates"].compact xml.title(title_parts.join(' — ')) xml.subtitle('An RSS feed with the latest materials, events, news in the GTN.') @@ -263,11 +274,11 @@ def generate_matrix_feed(site, mats, group_by: 'day', filter_by: nil) xml.entry do case group_by when 'day' - title = "GTN #{lookup[group_by]} updates for #{date.strftime('%B %d, %Y')}" + title = "#{date.strftime('%B %d, %Y')}" when 'week' - title = "GTN #{lookup[group_by]} updates for #{date.strftime('W%W, %Y')}" + title = "#{date.strftime('W%W, %Y')}" when 'month' - title = "GTN #{lookup[group_by]} updates for #{date.strftime('%B %Y')}" + title = "#{date.strftime('%B %Y')}" end xml.title(title) # Our IDs should be stable @@ -373,7 +384,7 @@ def generate_event_feeds(site) xml.link(href: "#{site.config['url']}#{site.baseurl}/events/feed.xml", rel: 'self') xml.updated(updated.to_datetime.rfc3339) xml.id("#{site.config['url']}#{site.baseurl}/events/feed.xml") - xml.title('GTN - Events') + xml.title('Events') xml.subtitle('Events in the Inter-Galactic Network') events.each do |page| From 23c0f52670ce715e217c6f6698f9dc3d263e5b2d Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Tue, 18 Jun 2024 09:53:54 +0200 Subject: [PATCH 08/26] improve display of widgets --- feed-widget.xslt.xml | 67 +++++++++++++++++++++++++++++++------------- feeds/index.md | 61 ++++++++++++++++++++++++++++++++++++++++ utils/widgets.md | 19 ------------- 3 files changed, 109 insertions(+), 38 deletions(-) create mode 100644 feeds/index.md delete mode 100644 utils/widgets.md diff --git a/feed-widget.xslt.xml b/feed-widget.xslt.xml index b0ef418e14a252..b7bce5b278fef5 100644 --- a/feed-widget.xslt.xml +++ b/feed-widget.xslt.xml @@ -11,31 +11,34 @@ GTN News Widget • <xsl:value-of select="atom:feed/atom:title"/> + + :root {--step--2: clamp(0.7813rem, 0.7747rem + 0.0326vi, 0.8rem);--step--1: clamp(0.9375rem, 0.9158rem + 0.1087vi, 1rem);--step-0: clamp(1.125rem, 1.0815rem + 0.2174vi, 1.25rem);--step-1: clamp(1.35rem, 1.2761rem + 0.3696vi, 1.5625rem);--step-2: clamp(1.62rem, 1.5041rem + 0.5793vi, 1.9531rem);--step-3: clamp(1.944rem, 1.771rem + 0.8651vi, 2.4414rem);--step-4: clamp(2.3328rem, 2.0827rem + 1.2504vi, 3.0518rem);--step-5: clamp(2.7994rem, 2.4462rem + 1.7658vi, 3.8147rem);--brand: #782760;--secondary: #b970a3;--brand-contrast: white;}body { font-family: 'Recursive', serif; color: var(--brand);}h1{font-size:var(--step-1);line-height:1.125em;margin:0; weight: 900; text-transform: capitalise;font-variation-settings: "wght" 900, "CRSV" 0.5, "CASL" 0;}h2{margin:0;font-size:var(--step-0); font-weight: 300; font-variation-settings: "wght" 500, "CRSV" 0.5, "CASL" 1;}p.authors{ font-variation-settings: "wght" 300, "CRSV" 1, "CASL" 1; margin-bottom: 0.4rem;}p { margin: 0; }a{text-decoration:none; color: var(--brand);}div.entry { position: relative; pointer: cursor; margin-bottom: 0.6rem; padding: 0.4rem; border: 1px solid var(--brand);}div.entry[data-has-link="true"]:hover { box-shadow: 4px 4px 0px #782760; }div.entry[data-has-link="true"]:active{ box-shadow: 2px 2px 0px #782760; }div a.cover {position: absolute;width: 100%;height: 100%;top: 0;left: 0;text-decoration: none;z-index: 10;}div small {display: none;}div.entry::hover {}div.entry:nth-child(2n) { --brand: white; --brand-contrast: #782760; color: var(--brand); background: var(--brand-contrast); }body { margin: 0; height: 100vh; display: grid; grid-template-columns: 1fr; grid-template-rows: auto 1fr auto; grid-template-areas: 'header' 'main' 'footer';}header {grid-area: header; padding: 0.5em; border-bottom: 2px solid var(--secondary); display: flex; align-items: center; justify-content: space-between;}header img {margin-right: 0.5em}main { grid-area: main; padding: 15px 5px 10px 5px; overflow-y: auto; overflow-x: hidden;}footer { grid-area: footer; padding: 0.5em; border-top: 2px solid var(--secondary); } div.entry ul a { text-decoration: underline; }footer a { text-decoration: underline; }main { background: /* Shadow Cover TOP */ linear-gradient( white 30%, rgba(255, 255, 255, 0) ) center top, /* Shadow Cover BOTTOM */ linear-gradient( rgba(255, 255, 255, 0), white 70% ) center bottom, /* Shadow TOP */ radial-gradient( farthest-side at 50% 0, rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0) ) center top, /* Shadow BOTTOM */ radial-gradient( farthest-side at 50% 100%, rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0) ) center bottom; background-repeat: no-repeat; background-size: 100% 40px, 100% 40px, 100% 14px, 100% 14px; background-attachment: local, local, scroll, scroll;} +
- - - +

+

+ + +
@@ -52,16 +55,31 @@
-

- - - - - - -

+ + + true + false + + +

+ + + + + + + + + + + + + +

+ +

- + By: @@ -70,6 +88,7 @@

+
@@ -95,6 +114,16 @@ --> + + + + + + + + + +
diff --git a/feeds/index.md b/feeds/index.md new file mode 100644 index 00000000000000..6d6a381a56ff53 --- /dev/null +++ b/feeds/index.md @@ -0,0 +1,61 @@ +--- +layout: page +title: GTN Feeds +--- + +We offer a wide range of RSS feeds to help you keep up to date with the latest training materials and events. You can subscribe to these feeds in your favourite RSS reader, or embed them in your own website. + +## Feed Directory + +- [GTN News]({{ site.baseurl }}/feed.xml) +- [GTN Events]({{ site.baseurl }}/events/feed.xml) +- Topic Feeds, which include all *new* tutorials, slides, or FAQs. + - [Single Cell]({{ site.baseurl }}/topics/single-cell/feed.xml) + - [Admin Training]({{ site.baseurl }}/topics/admin/feed.xml) + - ...and every other topic +- Monthly/Weekly/Daily Rollups, which include all *new* tutorials, slides, FAQs, and events. + - [GTN Monthly]({{ site.baseurl }}/feeds/matrix-month.xml) + - [GTN Weekly]({{ site.baseurl }}/feeds/matrix-week.xml) + - [GTN Daily]({{ site.baseurl }}/feeds/matrix-day.xml) +- Per-tag Monthly Rollups + - [Single Cell Month]({{ site.baseurl }}/feeds/single-cell-month.xml) + - [One Health Month]({{ site.baseurl }}/feeds/one-health-month.xml) + - Please request more if you need them, these are currently experimental, and only generated for a handful of topics while we figure out their implementation. + +## Embedding Feeds + +Any[^1] of the above feeds can be embedded anywhere you like. Simply replace +`.xml` with `.w.xml` in the URL and it'll produce a feed preview that is more +amenable to embedding. + + + + +```html + + +``` + +### Rollups + +We created these 'rollups' based on the bot that posted updates to our Matrix channel, they are simply digests of recent changes to help keep community members up to date. + + + + + +### Community Specific Rollups + +Some rollups were created for individual communities: + + + + +These are easily embedded, note the `.w.xml` ending, indicating a widget. (This is simply used to provide an alternate XSLT that renders better in an `iframe`. + +```html + + +``` + +[^1]: minus the main news feed currently as that is produced by a third party plugin diff --git a/utils/widgets.md b/utils/widgets.md deleted file mode 100644 index e84d8e9c5ef330..00000000000000 --- a/utils/widgets.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -layout: page -title: GTN Widgets ---- - -Embeddable RSS feed widget: - - - - - - - -These are easily embedded, note the `.w.xml` ending, indicating a widget. (This is simply used to provide an alternate XSLT that renders better in an `iframe`. - -```html - - -``` From 6b96e08ea08dda991d27275def363de91715d85f Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Tue, 18 Jun 2024 10:34:10 +0200 Subject: [PATCH 09/26] link tracking --- _plugins/feeds.rb | 4 ++-- feed-widget.xslt.xml | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/_plugins/feeds.rb b/_plugins/feeds.rb index f319fea1807fd2..7a7a959addaec7 100644 --- a/_plugins/feeds.rb +++ b/_plugins/feeds.rb @@ -320,11 +320,11 @@ def generate_matrix_feed(site, mats, group_by: 'day', filter_by: nil) items.each do |date, _type, page, _tags| xml.li do if page.is_a?(String) - href = "#{site.config['url']}#{site.config['baseurl']}/hall-of-fame/#{page}/" + href = "#{site.config['url']}#{site.config['baseurl']}/hall-of-fame/#{page}/?utm_source=matrix&utm_medium=newsbot&utm_campaign=matrix-news" text = "@#{page}" else text = page.data['title'] - href = "#{site.config['url']}#{site.config['baseurl']}#{page.url}" + href = "#{site.config['url']}#{site.config['baseurl']}#{page.url}?utm_source=matrix&utm_medium=newsbot&utm_campaign=matrix-news" end if group_by != 'day' text += " (#{date.strftime('%B %d, %Y')})" diff --git a/feed-widget.xslt.xml b/feed-widget.xslt.xml index b7bce5b278fef5..2b2a2f891b8dc5 100644 --- a/feed-widget.xslt.xml +++ b/feed-widget.xslt.xml @@ -13,7 +13,7 @@ GTN News Widget • <xsl:value-of select="atom:feed/atom:title"/> @@ -26,7 +26,7 @@ - +
@@ -34,11 +34,11 @@ @@ -66,7 +66,7 @@ - + @@ -120,7 +120,7 @@ - + From 3cf60c8381c8f08267b99ecb79afe0159cc9a922 Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Tue, 18 Jun 2024 11:04:19 +0200 Subject: [PATCH 10/26] found a poorly rendered faq --- .github/workflows/ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4a9211cd8b6041..785d1be09efa8a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -76,6 +76,10 @@ jobs: run: | ! fgrep -R 'lt;blockquote' _site + - name: Ensure no poorly rendered FAQs + run: | + ! fgrep -R 'box_type:' _site/ + - name: Ensure no poorly indented code blocks run: | bundle exec ruby bin/check-indent.rb From 9bf8eec0033aa7df710b0bb49d45210cdd194a0b Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Tue, 18 Jun 2024 11:04:49 +0200 Subject: [PATCH 11/26] add logo --- _plugins/feeds.rb | 5 ++++- feed-widget.xslt.xml | 7 ++++++- feed.xslt.xml | 5 +++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/_plugins/feeds.rb b/_plugins/feeds.rb index 7a7a959addaec7..8066e0dcabd66e 100644 --- a/_plugins/feeds.rb +++ b/_plugins/feeds.rb @@ -91,6 +91,7 @@ def generate_topic_feeds(site) topic_title = site.data[topic]['title'] xml.title("#{topic_title}") xml.subtitle("Recently added tutorials, slides, and FAQs in the #{topic} topic") + xml.logo("#{site.config['url']}#{site.baseurl}/assets/images/GTN-60px.png") topic_pages.each do |page| page_type = if page.path =~ %r{faqs/.*.md} @@ -268,7 +269,8 @@ def generate_matrix_feed(site, mats, group_by: 'day', filter_by: nil) xml.id("#{site.config['url']}#{site.baseurl}/#{path}") title_parts = [filter_title, "#{lookup[group_by]} Updates"].compact xml.title(title_parts.join(' — ')) - xml.subtitle('An RSS feed with the latest materials, events, news in the GTN.') + xml.subtitle('The latest materials, events, news in the GTN.') + xml.logo("#{site.config['url']}#{site.baseurl}/assets/images/GTN-60px.png") bucket.each do |date, parts| xml.entry do @@ -386,6 +388,7 @@ def generate_event_feeds(site) xml.id("#{site.config['url']}#{site.baseurl}/events/feed.xml") xml.title('Events') xml.subtitle('Events in the Inter-Galactic Network') + xml.logo("#{site.config['url']}#{site.baseurl}/assets/images/GTN-60px.png") events.each do |page| xml.entry do diff --git a/feed-widget.xslt.xml b/feed-widget.xslt.xml index 2b2a2f891b8dc5..c8468670993cd0 100644 --- a/feed-widget.xslt.xml +++ b/feed-widget.xslt.xml @@ -10,7 +10,12 @@ - GTN News Widget • <xsl:value-of select="atom:feed/atom:title"/> + <xsl:value-of select="atom:feed/atom:title"/> • GTN News + + + + + - - -
-
-

This is a web feed, also known as an RSS feed. Subscribe by copying the URL from the address bar into your newsreader app.

-
-
-
- -
-
-

Recent Items

- -
- - - - - -

(Feed Preview)

- -

-
- -

This RSS feed provides the latest posts from the Galaxy Training Network! - - - - - - Visit Website → - - -

- -

What is an RSS feed?

-

An RSS feed is a data format that contains the latest content from a website, blog, or podcast. You can use feeds to subscribe to websites and get the latest content in one place.

-
    -
  • Feeds put you in control. Unlike social media apps, there is no algorithm deciding what you see or read. You always get the latest content from the creators you care about.
  • -
  • Feed are private by design. No one owns web feeds, so no one is harvesting your personal information and profiting by selling it to advertisers.
  • -
  • Feeds are spam-proof. Had enough? Easy, just unsubscribe from the feed.
  • -
-

All you need to do to get started is to add the URL (web address) for this feed to a special app called a newsreader. Visit About Feeds to get started with newsreaders and subscribing. It’s free.

-
- - -
-

- - - - - - -

-

- - - - - - , - - -

- - -

- -

-
- -

- -

-
- - Published:
- Tags: - - - - , - - -
-
-
- - diff --git a/feed.xslt.xml b/feed.xslt.xml index 95e1bfd203c729..1df292da3b35fc 100644 --- a/feed.xslt.xml +++ b/feed.xslt.xml @@ -12,7 +12,7 @@ - + RSS/Atom Feed • <xsl:value-of select="atom:feed/atom:title"/> From 5c4e78ad7b57af45587e41a3a318622e670fca85 Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Tue, 18 Jun 2024 12:13:59 +0200 Subject: [PATCH 17/26] synchronize xslts --- feed-widget.xslt.xml | 55 +++++++++++------- feed.xslt.xml | 135 ++++++++++++++++++++++++++++--------------- 2 files changed, 122 insertions(+), 68 deletions(-) diff --git a/feed-widget.xslt.xml b/feed-widget.xslt.xml index 48062a4f4450d0..294f60230be1cd 100644 --- a/feed-widget.xslt.xml +++ b/feed-widget.xslt.xml @@ -18,7 +18,31 @@ @@ -56,15 +80,6 @@ - - - -
@@ -91,7 +106,7 @@

- By: + By: @@ -102,19 +117,16 @@

- - -

+

+ + -

-
- -

+ + -

-
+
- diff --git a/feed.xslt.xml b/feed.xslt.xml index 1df292da3b35fc..a137f07c41e560 100644 --- a/feed.xslt.xml +++ b/feed.xslt.xml @@ -10,72 +10,107 @@ + <xsl:value-of select="atom:feed/atom:title"/> • GTN News - RSS/Atom Feed • <xsl:value-of select="atom:feed/atom:title"/> + -
+

This is a web feed, also known as an RSS feed. Subscribe by copying the URL from the address bar into your newsreader app.

-
-
- -
-
+
+

+ + + + + + +

+

+
+

What is an RSS feed?

+

An RSS feed is a data format that contains the latest content from a website, blog, or podcast. You can use feeds to subscribe to websites and get the latest content in one place.

+
    +
  • Feeds put you in control. Unlike social media apps, there is no algorithm deciding what you see or read. You always get the latest content from the creators you care about.
  • +
  • Feed are private by design. No one owns web feeds, so no one is harvesting your personal information and profiting by selling it to advertisers.
  • +
  • Feeds are spam-proof. Had enough? Easy, just unsubscribe from the feed.
  • +
+

All you need to do to get started is to add the URL (web address) for this feed to a special app called a newsreader. Visit About Feeds to get started with newsreaders and subscribing. It’s free.

+ +

Recent Items

-
+ + - -

(Feed Preview)

- -

-
- -

This RSS feed provides the latest posts from the Galaxy Training Network! - - - - - - Visit Website → - - -

- -

What is an RSS feed?

-

An RSS feed is a data format that contains the latest content from a website, blog, or podcast. You can use feeds to subscribe to websites and get the latest content in one place.

-
    -
  • Feeds put you in control. Unlike social media apps, there is no algorithm deciding what you see or read. You always get the latest content from the creators you care about.
  • -
  • Feed are private by design. No one owns web feeds, so no one is harvesting your personal information and profiting by selling it to advertisers.
  • -
  • Feeds are spam-proof. Had enough? Easy, just unsubscribe from the feed.
  • -
-

All you need to do to get started is to add the URL (web address) for this feed to a special app called a newsreader. Visit About Feeds to get started with newsreaders and subscribing. It’s free.

-
-
+ + + true + false + +

- - - - - - + + + + + + + + + + + + +

+ +

- + By: @@ -84,8 +119,17 @@

-

- + + +

+ + + + + + + +

Published:
@@ -99,5 +143,4 @@
- From 37148ad62185256f2c6335b5a2a7c8cc6cc82d25 Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Tue, 18 Jun 2024 12:48:46 +0200 Subject: [PATCH 18/26] add workflows to news --- _plugins/feeds.rb | 55 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/_plugins/feeds.rb b/_plugins/feeds.rb index 4ac556d9c05ca6..c0f2af459e7827 100644 --- a/_plugins/feeds.rb +++ b/_plugins/feeds.rb @@ -2,6 +2,7 @@ require './_plugins/jekyll-topic-filter' require './_plugins/gtn' +require 'json' # TODO: move into a lib somewhere. def collapse_date_pretty(event) @@ -67,7 +68,8 @@ def markdownify(site, text) 'tutorials' => '📚', 'slides' => '🖼️', 'news' => '📰', - 'faqs' => '❓' + 'faqs' => '❓', + 'workflows' => '🛠️', } def generate_topic_feeds(site, topic, bucket) @@ -147,6 +149,7 @@ def all_date_sorted_materials(site) materials = TopicFilter.list_all_materials(site).reject { |k, _v| k['draft'] } news = site.posts.select { |x| x['layout'] == 'news' } faqs = site.pages.select { |x| x['layout'] == 'faq' } + workflows = Dir.glob('topics/**/*.ga') bucket = events.map do |e| [Gtn::PublicationTimes.obtain_time(e.path).to_datetime, 'events', e, ['event'] + e.data.fetch('tags', [])] @@ -172,6 +175,37 @@ def all_date_sorted_materials(site) [Gtn::PublicationTimes.obtain_time(n.path).to_datetime, 'faqs', n, ['faqs', tag]] end + bucket += workflows.map do |n| + tag = Gtn::PublicationTimes.clean_path(n).split('/')[1] + wf_data = JSON.parse(File.read(n)) + obj = Hash.new + obj['__path'] = n + obj['title'] = wf_data['name'] + obj['description'] = wf_data['annotation'] + obj['tags'] = wf_data['tags'] + obj['contributors'] = wf_data.fetch('creator', []).map do |c| + p ">> #{c}" + matched = site.data['contributors'].select{|k, v| v.fetch('orcid', nil) == c.fetch('identifier', false)}.first + if matched + matched[0] + else + c['name'] + end + end + # Fake a page. + def obj.data + self + end + def obj.path + self['__path'] + end + def obj.url + '/' + self['__path'][0..self['__path'].rindex('/')] + end + + [Gtn::PublicationTimes.obtain_time(n).to_datetime, 'workflows', obj, ['workflows', tag] + obj['tags']] + end + bucket += site.data['contributors'].map do |k, v| [DateTime.parse("#{v['joined']}-01"), 'contributors', k, ['contributor']] end @@ -292,30 +326,20 @@ def generate_matrix_feed(site, mats, group_by: 'day', filter_by: nil) xml.div(xmlns: 'http://www.w3.org/1999/xhtml') do # xml.h4 title - icon_for = { - 'contributors' => '🧑‍🏫', - 'funders' => '💰', - 'organisations' => '🏢', - 'events' => '📅', - 'tutorials' => '📚', - 'slides' => '🖼️', - 'news' => '📰', - 'faqs' => '❓' - } - prio = [ 'news', 'events', 'tutorials', 'slides', 'faqs', + 'workflows', 'contributors', 'funders', 'organisations' ].map.with_index { |x, i| [x, i] }.to_h parts.group_by { |x| x[1] }.sort_by { |x| prio[x[1]] }.each do |type, items| - xml.h4 "#{icon_for[type]} #{type.capitalize}" + xml.h4 "#{ICON_FOR[type]} #{type.capitalize}" if items.length.positive? xml.ul do items.each do |date, _type, page, _tags| @@ -454,8 +478,9 @@ def generate_event_feeds(site) bucket = all_date_sorted_materials(site) bucket.freeze - generate_topic_feeds(site, 'admin', bucket) - generate_topic_feeds(site, 'one-health', bucket) + TopicFilter.list_topics(site).each do |topic| + generate_topic_feeds(site, topic, bucket) + end generate_matrix_feed(site, bucket, group_by: 'day') generate_matrix_feed(site, bucket, group_by: 'week') From 7de69ef87596d9387ee8d585fc559992ec12a9f4 Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Tue, 18 Jun 2024 12:49:26 +0200 Subject: [PATCH 19/26] handle null contributor names for workflows --- _plugins/feeds.rb | 16 ++++++++++------ _plugins/gtn/contributors.rb | 10 ++++++---- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/_plugins/feeds.rb b/_plugins/feeds.rb index c0f2af459e7827..4d13deb565d39e 100644 --- a/_plugins/feeds.rb +++ b/_plugins/feeds.rb @@ -118,15 +118,19 @@ def generate_topic_feeds(site, topic, bucket) Gtn::Contributors.get_authors(page.data).each do |c| xml.author do - xml.name(Gtn::Contributors.fetch_name(site, c)) - xml.uri("#{site.config['url']}#{site.baseurl}/hall-of-fame/#{c}/") + xml.name(Gtn::Contributors.fetch_name(site, c, warn:false)) + if c !~ / / + xml.uri("#{site.config['url']}#{site.baseurl}/hall-of-fame/#{c}/") + end end end Gtn::Contributors.get_non_authors(page.data).each do |c| xml.contributor do - xml.name(Gtn::Contributors.fetch_name(site, c)) - xml.uri("#{site.config['url']}#{site.baseurl}/hall-of-fame/#{c}/") + xml.name(Gtn::Contributors.fetch_name(site, c, warn:false)) + if c !~ / / + xml.uri("#{site.config['url']}#{site.baseurl}/hall-of-fame/#{c}/") + end end end end @@ -447,7 +451,7 @@ def generate_event_feeds(site) Gtn::Contributors.get_organisers(page.data).each do |c| xml.author do - xml.name(Gtn::Contributors.fetch_name(site, c)) + xml.name(Gtn::Contributors.fetch_name(site, c, warn:false)) xml.uri("#{site.config['url']}#{site.baseurl}/hall-of-fame/#{c}/") if page.data['contact_email'] xml.email(page.data['contact_email']) @@ -457,7 +461,7 @@ def generate_event_feeds(site) Gtn::Contributors.get_instructors(page.data).each do |c| xml.contributor do - xml.name(Gtn::Contributors.fetch_name(site, c)) + xml.name(Gtn::Contributors.fetch_name(site, c, warn:false)) xml.uri("#{site.config['url']}#{site.baseurl}/hall-of-fame/#{c}/") end end diff --git a/_plugins/gtn/contributors.rb b/_plugins/gtn/contributors.rb index ff36fb0b572f04..393c005c63d9d2 100644 --- a/_plugins/gtn/contributors.rb +++ b/_plugins/gtn/contributors.rb @@ -118,7 +118,7 @@ def self._load_file(site, category) # Returns: # +Hash+ of contributor information # +String+ type of contributor (e.g. 'contributor', 'organisation', 'funder') - def self.fetch(site, c) + def self.fetch(site, c, warn: false) if _load_file(site, 'contributors').key?(c) return ['contributor', site.data['contributors'][c]] elsif _load_file(site, 'organisations').key?(c) @@ -126,7 +126,9 @@ def self.fetch(site, c) elsif _load_file(site, 'funders').key?(c) return ['funder', site.data['funders'][c]] else - Jekyll.logger.warn "Contributor #{c} not found" + if ! warn + Jekyll.logger.warn "Contributor #{c} not found" + end end ['contributor', { 'name' => c }] @@ -150,8 +152,8 @@ def self.fetch_contributor(site, c) # +c+:: +String+ of contributor ID # Returns: # +String+ of contributor name - def self.fetch_name(site, c) - fetch(site, c)[1].fetch('name', c) + def self.fetch_name(site, c, warn: false) + fetch(site, c, warn: warn)[1].fetch('name', c) end ## From be012032281df5f7675e8cd9774008be4aabef2d Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Tue, 18 Jun 2024 12:57:23 +0200 Subject: [PATCH 20/26] fix sorting, times --- _plugins/feeds.rb | 2 +- _plugins/gtn/mod.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/_plugins/feeds.rb b/_plugins/feeds.rb index 4d13deb565d39e..ded10b07cdd8f3 100644 --- a/_plugins/feeds.rb +++ b/_plugins/feeds.rb @@ -342,7 +342,7 @@ def generate_matrix_feed(site, mats, group_by: 'day', filter_by: nil) 'organisations' ].map.with_index { |x, i| [x, i] }.to_h - parts.group_by { |x| x[1] }.sort_by { |x| prio[x[1]] }.each do |type, items| + parts.group_by { |x| x[1] }.sort_by { |x| prio[x[0]] }.each do |type, items| xml.h4 "#{ICON_FOR[type]} #{type.capitalize}" if items.length.positive? xml.ul do diff --git a/_plugins/gtn/mod.rb b/_plugins/gtn/mod.rb index 9176690171c5be..63f9cab9e66417 100644 --- a/_plugins/gtn/mod.rb +++ b/_plugins/gtn/mod.rb @@ -136,7 +136,7 @@ def self.init_cache .map { |x| x.split("\n\n") } .select { |x| x.length > 1 } .each do |date, files| - files.split("\n").grep(/\.(md|html)$/).each do |f| + files.split("\n").grep(/\.(md|html|ga)$/).each do |f| modification_type, path = f.split("\t") if modification_type == 'A' # Chase the renames. From 714422cc772bdab9b3cefe884a1e8c0c1f851796 Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Tue, 18 Jun 2024 13:00:54 +0200 Subject: [PATCH 21/26] expand all feeds --- _plugins/feeds.rb | 5 +---- feed-widget.xslt.xml | 5 +++++ feeds/index.md | 9 ++++++++- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/_plugins/feeds.rb b/_plugins/feeds.rb index ded10b07cdd8f3..beb53acdcac7d6 100644 --- a/_plugins/feeds.rb +++ b/_plugins/feeds.rb @@ -476,7 +476,6 @@ def generate_event_feeds(site) # Basically like `PageWithoutAFile` Jekyll::Hooks.register :site, :post_write do |site| if Jekyll.env == 'production' - generate_topic_feeds(site) generate_event_feeds(site) bucket = all_date_sorted_materials(site) @@ -484,13 +483,11 @@ def generate_event_feeds(site) TopicFilter.list_topics(site).each do |topic| generate_topic_feeds(site, topic, bucket) + generate_matrix_feed(site, bucket, group_by: 'month', filter_by: topic) end generate_matrix_feed(site, bucket, group_by: 'day') generate_matrix_feed(site, bucket, group_by: 'week') generate_matrix_feed(site, bucket, group_by: 'month') - generate_matrix_feed(site, bucket, group_by: 'month', filter_by: 'single-cell') - generate_matrix_feed(site, bucket, group_by: 'month', filter_by: 'genome-annotation') - generate_matrix_feed(site, bucket, group_by: 'month', filter_by: 'one-health') end end diff --git a/feed-widget.xslt.xml b/feed-widget.xslt.xml index 294f60230be1cd..025c21a33fa91a 100644 --- a/feed-widget.xslt.xml +++ b/feed-widget.xslt.xml @@ -75,6 +75,11 @@ main { overflow-y: auto; overflow-x: hidden; } CC-BY 4.0FAIR + • + + + 🔗 + diff --git a/feeds/index.md b/feeds/index.md index 49d7435dd17aed..90957bb0787907 100644 --- a/feeds/index.md +++ b/feeds/index.md @@ -26,6 +26,8 @@ We offer a wide range of RSS feeds to help you keep up to date with the latest t Any[^1] of the above feeds can be embedded anywhere you like. Simply replace `.xml` with `.w.xml` in the URL and it'll produce a feed preview that is more + +[^1]: minus the main news feed currently as that is produced by a third party plugin amenable to embedding. @@ -68,4 +70,9 @@ These are easily embedded, note the `.w.xml` ending, indicating a widget. (This ``` -[^1]: minus the main news feed currently as that is produced by a third party plugin +### Differences between feeds + +Having two feeds with the same data might seem a bit odd but we have two separate user stories we want to address: + +- **Feed Reader**: This is the feed you'd subscribe to in your feed reader, and more importantly, the sort of feed that you'd send to someone else if they were curious how to follow updates to the GTN. +- **Feed Widget**: This is the feed you'd embed in your website, or in a widget on a page. It's designed to be more visually appealing and easier to read in a small space. From ec1301887b551f8ffa30b70a27dacbe408d0c801 Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Tue, 18 Jun 2024 13:02:32 +0200 Subject: [PATCH 22/26] add wfs --- feeds/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/feeds/index.md b/feeds/index.md index 90957bb0787907..c43c65490b8ae8 100644 --- a/feeds/index.md +++ b/feeds/index.md @@ -9,18 +9,18 @@ We offer a wide range of RSS feeds to help you keep up to date with the latest t - [GTN News]({{ site.baseurl }}/feed.xml) - [GTN Events]({{ site.baseurl }}/events/feed.xml) -- Topic Feeds, which include all *new* tutorials, slides, or FAQs. +- Topic Feeds, which include all *new* tutorials, slides, FAQs, workflows, and events. - [Single Cell]({{ site.baseurl }}/topics/single-cell/feed.xml) - [Admin Training]({{ site.baseurl }}/topics/admin/feed.xml) - ...and every other topic -- Monthly/Weekly/Daily Rollups, which include all *new* tutorials, slides, FAQs, and events. +- Monthly/Weekly/Daily Rollups, which include all *new* tutorials, slides, workflows, FAQs, events, and contributors. - [GTN Monthly]({{ site.baseurl }}/feeds/matrix-month.xml) - [GTN Weekly]({{ site.baseurl }}/feeds/matrix-week.xml) - [GTN Daily]({{ site.baseurl }}/feeds/matrix-day.xml) - Per-tag Monthly Rollups - [Single Cell Month]({{ site.baseurl }}/feeds/single-cell-month.xml) - [One Health Month]({{ site.baseurl }}/feeds/one-health-month.xml) - - Please request more if you need them, these are currently experimental, and only generated for a handful of topics while we figure out their implementation. + - ...and every other topic / tag based topic (i.e. topics linked from the home page) ## Embedding Feeds From 3b490636184b73e9b5c94cb8bf5ce337ff93fc27 Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Tue, 18 Jun 2024 13:06:01 +0200 Subject: [PATCH 23/26] add self link --- feed-widget.xslt.xml | 6 ++++-- feed.xslt.xml | 7 +++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/feed-widget.xslt.xml b/feed-widget.xslt.xml index 025c21a33fa91a..ced48812006209 100644 --- a/feed-widget.xslt.xml +++ b/feed-widget.xslt.xml @@ -70,14 +70,16 @@ main { overflow-y: auto; overflow-x: hidden; } diff --git a/feed.xslt.xml b/feed.xslt.xml index a137f07c41e560..9a8056ef451265 100644 --- a/feed.xslt.xml +++ b/feed.xslt.xml @@ -79,6 +79,13 @@ footer a:hover{ font-weight:700; } CC-BY 4.0FAIR + • + + + + + 🔗 + From 91db459991d9e083df5622ae5169c7e71704e05b Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Tue, 18 Jun 2024 13:07:03 +0200 Subject: [PATCH 24/26] link blog --- feeds/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feeds/index.md b/feeds/index.md index c43c65490b8ae8..bae17f121a8e45 100644 --- a/feeds/index.md +++ b/feeds/index.md @@ -3,7 +3,7 @@ layout: page title: GTN Feeds --- -We offer a wide range of RSS feeds to help you keep up to date with the latest training materials and events. You can subscribe to these feeds in your favourite RSS reader, or embed them in your own website. +We offer a wide range of [RSS feeds]({{ site.baseurl }}/news/2024/06/04/gtn-standards-rss.html) to help you keep up to date with the latest training materials and events. You can subscribe to these feeds in your favourite RSS reader, or embed them in your own website. ## Feed Directory From 02b0bcee85c39130c363660049abc25b943cb745 Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Tue, 18 Jun 2024 13:24:10 +0200 Subject: [PATCH 25/26] handle nil event topics, link to post --- _plugins/jekyll-topic-filter.rb | 3 +++ news/_posts/2024-06-04-gtn-standards-rss.md | 2 ++ 2 files changed, 5 insertions(+) diff --git a/_plugins/jekyll-topic-filter.rb b/_plugins/jekyll-topic-filter.rb index c999b810d8020e..52c41351a83202 100644 --- a/_plugins/jekyll-topic-filter.rb +++ b/_plugins/jekyll-topic-filter.rb @@ -199,6 +199,9 @@ def self.list_materials_structured(site, topic_name) # Returns: # +Hash+:: The tutorial material def self.fetch_tutorial_material(site, topic_name, tutorial_name) + if topic_name.nil? + return nil + end fill_cache(site) if site.data['cache_topic_filter'][topic_name].nil? Jekyll.logger.warn "Cannot fetch tutorial material for #{topic_name}" diff --git a/news/_posts/2024-06-04-gtn-standards-rss.md b/news/_posts/2024-06-04-gtn-standards-rss.md index 796aeb950c3eac..b12ce98489dc6f 100644 --- a/news/_posts/2024-06-04-gtn-standards-rss.md +++ b/news/_posts/2024-06-04-gtn-standards-rss.md @@ -15,6 +15,8 @@ contributions: The GTN loves leveraging existing standards for both old and new purposes. One of our favourite standards that we adhere to is providing an RSS/Atom news feed for sharing news and events and updates! +**Update 2024 Jun 18**: We've added a new home page for all of our feeds: [GTN feeds home]({% link feeds/index.md %}) + ## Why RSS/Atom? RSS feeds provide access to the latest news and updates from websites. They are a great way to keep up to date with your favourite websites without having to visit them every day, and without having to sign up for a mailing list or social media account. You can subscribe to feeds using a [feed reader](https://aboutfeeds.com/), which will automatically check for updates and display them for you. From 65690e5eabcb1a8d20f6527de67d06b947e2b20c Mon Sep 17 00:00:00 2001 From: Helena Rasche Date: Tue, 18 Jun 2024 13:25:34 +0200 Subject: [PATCH 26/26] exception for url linting --- feeds/index.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/feeds/index.md b/feeds/index.md index bae17f121a8e45..7e31c9886607b9 100644 --- a/feeds/index.md +++ b/feeds/index.md @@ -7,6 +7,8 @@ We offer a wide range of [RSS feeds]({{ site.baseurl }}/news/2024/06/04/gtn-stan ## Feed Directory +{% if jekyll.environment == "production" %} + - [GTN News]({{ site.baseurl }}/feed.xml) - [GTN Events]({{ site.baseurl }}/events/feed.xml) - Topic Feeds, which include all *new* tutorials, slides, FAQs, workflows, and events. @@ -22,6 +24,10 @@ We offer a wide range of [RSS feeds]({{ site.baseurl }}/news/2024/06/04/gtn-stan - [One Health Month]({{ site.baseurl }}/feeds/one-health-month.xml) - ...and every other topic / tag based topic (i.e. topics linked from the home page) +{% else %} +GTN Feed listing is not available in development mode. (This is done so we don't need to generate the feed pages or add an exception to our URL checking, while keeping CI times fast.) +{% endif %} + ## Embedding Feeds Any[^1] of the above feeds can be embedded anywhere you like. Simply replace