<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Mike Hyden</title>
    <description>The latest articles on Forem by Mike Hyden (@mikehgolang).</description>
    <link>https://forem.com/mikehgolang</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F993677%2F6244194d-560c-4f39-8d37-1d7563651f19.jpeg</url>
      <title>Forem: Mike Hyden</title>
      <link>https://forem.com/mikehgolang</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mikehgolang"/>
    <language>en</language>
    <item>
      <title>Reading rss feed and generating static html with golang</title>
      <dc:creator>Mike Hyden</dc:creator>
      <pubDate>Tue, 20 Dec 2022 18:16:16 +0000</pubDate>
      <link>https://forem.com/mikehgolang/reading-rss-feed-and-generating-static-html-with-golang-4cpi</link>
      <guid>https://forem.com/mikehgolang/reading-rss-feed-and-generating-static-html-with-golang-4cpi</guid>
      <description>&lt;h2&gt;
  
  
  Prerequisite
&lt;/h2&gt;

&lt;p&gt;In order to follow this tutorial you will need to have golang installed on your machine&lt;/p&gt;

&lt;h2&gt;
  
  
  Project
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Finding rss feed
&lt;/h3&gt;

&lt;p&gt;We're gonna use this rss feed from this cool &lt;a href="https://www.devshirt.club/" rel="noopener noreferrer"&gt;developers tshirt&lt;/a&gt; shop.&lt;/p&gt;

&lt;p&gt;They have rss of their newest t-shirt releases. &lt;br&gt;
You can find it &lt;a href="https://www.devshirt.club/developer-shirt/rss.xml" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Creating a new project
&lt;/h3&gt;

&lt;p&gt;1.) In your &lt;code&gt;$GOPATH&lt;/code&gt; create a new project&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mkdir rss_feed&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;2.) navigate to directory and init mod&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cd rss_feed &amp;amp;&amp;amp; go mod init&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;3.) install rss reader dependency&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;go get github.com/mmcdole/gofeed&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Reading the rss feed
&lt;/h3&gt;

&lt;p&gt;Reading the rss feed is super simple with mmcdole's library&lt;/p&gt;

&lt;p&gt;our full main:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package main

import (
    "log"

    "github.com/mmcdole/gofeed"
)

var FeedUrl = "https://www.devshirt.club/developer-shirt/rss.xml"

func main() {
    fp := gofeed.NewParser()
    fp.UserAgent = "MyCustomAgent 1.0"
    feed, _ := fp.ParseURL(FeedUrl)

    log.Printf("read the feed %#v", feed)
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Creating html template
&lt;/h3&gt;

&lt;p&gt;Here we are gonna use golangs built in template, what it will expect is for us to pass a slice of articles, and in return it will generate us a simple html page.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type Article struct {
    Title       string
    Description string
    ImageTitle  string
    ImageUrl    string
    Link        string
}

var siteTemplate string = `
    &amp;lt;html&amp;gt;
        &amp;lt;head&amp;gt;
            &amp;lt;!-- Latest compiled and minified CSS --&amp;gt;
            &amp;lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"&amp;gt;

            &amp;lt;!-- Optional theme --&amp;gt;
            &amp;lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous"&amp;gt;

            &amp;lt;!-- Latest compiled and minified JavaScript --&amp;gt;
            &amp;lt;script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"&amp;gt;&amp;lt;/script&amp;gt;
        &amp;lt;/head&amp;gt;
        &amp;lt;body&amp;gt;
            &amp;lt;div class="container"&amp;gt;
                &amp;lt;h1&amp;gt; Example of dynamic rss feed parsing &amp;lt;/h1&amp;gt;
                {{ range $key, $item := . }}
                    &amp;lt;article&amp;gt;
                        &amp;lt;h2&amp;gt;{{ $item.Title }}&amp;lt;/h2&amp;gt;
                        &amp;lt;img src="{{$item.ImageUrl}}"  style="max-width: 400px;" /&amp;gt;
                        &amp;lt;p&amp;gt;
                        {{$item.Description}}
                        &amp;lt;br /&amp;gt;
                            &amp;lt;a href="{{$item.Link}}"/&amp;gt; Read more &amp;lt;/a&amp;gt; 
                        &amp;lt;/p&amp;gt;
                    &amp;lt;/article&amp;gt;
                {{ end }}
            &amp;lt;/div&amp;gt;
        &amp;lt;/body&amp;gt;
    &amp;lt;/html&amp;gt;
`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Tying it all together
&lt;/h3&gt;

&lt;p&gt;We are gonna load our feed, based on that iterate and create our slice of articles and simply output to console our generated html&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package main

import (
    "log"
    "os"
    "text/template"

    "github.com/mmcdole/gofeed"
)

var FeedUrl = "https://www.devshirt.club/developer-shirt/rss.xml"

type Article struct {
    Title       string
    Description string
    ImageTitle  string
    ImageUrl    string
    Link        string
}

var siteTemplate string = `
    &amp;lt;html&amp;gt;
        &amp;lt;head&amp;gt;
            &amp;lt;!-- Latest compiled and minified CSS --&amp;gt;
            &amp;lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"&amp;gt;

            &amp;lt;!-- Optional theme --&amp;gt;
            &amp;lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous"&amp;gt;

            &amp;lt;!-- Latest compiled and minified JavaScript --&amp;gt;
            &amp;lt;script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"&amp;gt;&amp;lt;/script&amp;gt;
        &amp;lt;/head&amp;gt;
        &amp;lt;body&amp;gt;
            &amp;lt;div class="container"&amp;gt;
                &amp;lt;h1&amp;gt; Example of dynamic rss feed parsing &amp;lt;/h1&amp;gt;
                {{ range $key, $item := . }}
                    &amp;lt;article&amp;gt;
                        &amp;lt;h2&amp;gt;{{ $item.Title }}&amp;lt;/h2&amp;gt;
                        &amp;lt;img src="{{$item.ImageUrl}}"  style="max-width: 400px;" /&amp;gt;
                        &amp;lt;p&amp;gt;
                        {{$item.Description}}
                        &amp;lt;br /&amp;gt;
                            &amp;lt;a href="{{$item.Link}}"/&amp;gt; Read more &amp;lt;/a&amp;gt; 
                        &amp;lt;/p&amp;gt;
                    &amp;lt;/article&amp;gt;
                {{ end }}
            &amp;lt;/div&amp;gt;
        &amp;lt;/body&amp;gt;
    &amp;lt;/html&amp;gt;
`

func main() {
    fp := gofeed.NewParser()
    fp.UserAgent = "MyCustomAgent 1.0"
    feed, err := fp.ParseURL(FeedUrl)
    if err != nil {
        log.Fatal(err)
    }

    var articles []Article

    for _, item := range feed.Items {
        article := Article{
            Title:       item.Title,
            Description: item.Description,
            Link:        item.Link,
            ImageUrl:    item.Extensions["media"]["content"][0].Attrs["url"],
        }

        articles = append(articles, article)

    }

    tmpl, err := template.New("site").Parse(siteTemplate)
    if err != nil {
        log.Fatal(err)
    }

    err = tmpl.Execute(os.Stdout, articles)
    if err != nil {
        log.Fatal(err)
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>career</category>
      <category>cybersecurity</category>
      <category>learning</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
