{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "shindakun dot dev",
  "description": "a development blog",
  "home_page_url": "https://shindakun.dev/",
  "feed_url": "https://shindakun.dev/index.json",
  "language": "en-us",
  "items": [
    {
      "title": "obsidian-markdown-export-plugin",
      "date_published": "2024-06-28T09:00:40-07:00",
      "date_modified": "2024-06-28T09:00:40-07:00",
      "id": "https://shindakun.dev/posts/obsidian-markdown-export-plugin/",
      "url": "https://shindakun.dev/posts/obsidian-markdown-export-plugin/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003ch2 id=\"intro\"\u003eIntro\u003c/h2\u003e\n\u003cp\u003eDusting off my blog has lead me to look again at my posting workflow. Since I want it to be as low friction as possible. Typically I write my posts in Obsidian and then copy the Markdown file to my posts directory. That directory is checked into GitHub. This left a lot to be desired, images were typically left out of the loop and were uploaded separately to my server.\u003c/p\u003e\n\u003ch2 id=\"a-better-way\"\u003eA Better Way\u003c/h2\u003e\n\u003cp\u003eLooking to smooth out the process led me to a post from a little while back from \u003ca href=\"https://cassidoo.co/post/publishing-from-obsidian/\"\u003eCassidy Williams\u003c/a\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe \u003ca href=\"https://github.com/cassidoo/blahg\"\u003erepository for this blog\u003c/a\u003e is separate from my Obsidian vault, so normally I have to do some copying and pasting across folders, which is \u003cem\u003efine\u003c/em\u003e but really slows me down.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eAmen to that! But there is a solution the cleverly named \u003ccode\u003eobsidian-markdown-export-plugin\u003c/code\u003e which after a \u003ca href=\"https://github.com/bingryan/obsidian-markdown-export-plugin/issues/52\"\u003efeature request\u003c/a\u003e supports out of the vault exports with attachments no less! Thanks Cassidy for that request. And thanks to \u003ca href=\"https://github.com/bingryan\"\u003ebingryan\u003c/a\u003e for the plugin!\u003c/p\u003e\n\u003ch3 id=\"an-even-better-way\"\u003eAn Even Better Way\u003c/h3\u003e\n\u003cp\u003eProblem is it\u0026rsquo;s not quite what I needed for my Hugo blog. I need it to export using the Markdown filename as part of the path and to include the images attachment directory within that.\u003c/p\u003e\n\u003cp\u003eSo if my content was in\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/posts\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eI would want the output to be\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/posts/Title of Markdown File/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/posts/Title of Markdown File/attachments\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAt first I put in a \u003ca href=\"https://github.com/bingryan/obsidian-markdown-export-plugin/issues/85\"\u003efeature request\u003c/a\u003e of my own. But after a few moments I got the itch to see if I could just hack something together. So I cloned the repo to take a look at the code.\u003c/p\u003e\n\u003cp\u003eA bit a sniffing around and I found the couple of places where the code creates the directories and exports the image files.\u003c/p\u003e\n\u003cp\u003eA quick path addition later\u0026hellip;\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e dir \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e file.name.replace(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;.md\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#586e75\"\u003e// try create attachment directory\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\t\t\u003cspan style=\"color:#268bd2\"\u003eawait\u003c/span\u003e tryCreateFolder(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\u003cspan style=\"color:#719e07\"\u003ethis\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tpath.join(\u003cspan style=\"color:#719e07\"\u003ethis\u003c/span\u003e.settings.output, dir, \u003cspan style=\"color:#719e07\"\u003ethis\u003c/span\u003e.settings.attachment),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t);\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAnd we had the right folder structure in place!\u003c/p\u003e\n\u003cp\u003eOne more quick tweak and we had images saving in the correct spot too!\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\t\t\u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e dir \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e filename.replace(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;.md\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\t\t\u003cspan style=\"color:#268bd2\"\u003econst\u003c/span\u003e targetPath \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e path\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\t\t\t.join(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\t\t\t\tplugin.settings.output,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\t\t\t\tdir,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\t\t\t\tplugin.settings.attachment,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\t\t\t\timageLinkMd5.concat(imageExt),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\t\t\t)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\t\t\t.replace(\u003cspan style=\"color:#dc322f\"\u003e/\\\\/g\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;/\u0026#34;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAlright! That\u0026rsquo;s the end of our journey right?! Well, not quite. In this case I ended up with the output being\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/posts/Title of Markdown File/Title of Markdown File.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/posts/Title of Markdown File/attachments/randomimage.png\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis seemed to cause Hugo to render extra directories which would make my site look like this\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehttp://shindakun.dev/title-of-markdown-file/title-of-markdown-file/index.html\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAnd that just can\u0026rsquo;t stand! So instead of saving as the filename I had it save directly to \u003ccode\u003eindex.md\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\t\u003cspan style=\"color:#719e07\"\u003ecase\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;markdown\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\t\t\u003cspan style=\"color:#268bd2\"\u003econst\u003c/span\u003e targetFile \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e path.join(outDir, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;index.md\u0026#34;\u003c/span\u003e);\u003cspan style=\"color:#586e75\"\u003e// file.name);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\t\t\t\t\t\u003cspan style=\"color:#268bd2\"\u003eawait\u003c/span\u003e tryCreate(plugin, targetFile, content);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\t\t\u003cspan style=\"color:#719e07\"\u003ebreak\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\t}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis tells Hugo to not render any further and instead we end up with the path of\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehttp://shindakun.dev/title-of-markdown-file/index.html\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eJust what the doctor ordered!\u003c/p\u003e\n\u003ch3 id=\"wrapping-up\"\u003eWrapping Up\u003c/h3\u003e\n\u003cp\u003eNow I just need to decide if I\u0026rsquo;m going to brush off my TypeScript knowledge and clean up the patch I did to actually use a setting and give people the option to have output like this. What do you say? Should I?\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n"
    },
    {
      "title": "go-feedi",
      "date_published": "2024-06-26T20:03:43-07:00",
      "date_modified": "2024-06-26T20:03:43-07:00",
      "id": "https://shindakun.dev/posts/go-feedi/",
      "url": "https://shindakun.dev/posts/go-feedi/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003ch2 id=\"intro\"\u003eIntro\u003c/h2\u003e\n\u003cp\u003eFor months now I\u0026rsquo;ve had a tab open in my browser on my main computer - \u003ca href=\"https://olano.dev/blog/reclaiming-the-web-with-a-personal-reader\"\u003eReclaiming the Web with a Personal Reader\u003c/a\u003e. I\u0026rsquo;ve read the article a couple of times and really like the idea of using a personal and extendable feed reader.\u003c/p\u003e\n\u003cp\u003eFinally around a week ago I cloned the repo from \u003ca href=\"https://github.com/facundoolano/feedi\"\u003eGitHub\u003c/a\u003e to check it out. After a couple of tweaks to the Makefile to make it work with my laptops configuration I was up and running. Someone else noticed the thing with the port being in use so they submitted a pull request on the repo so I didn\u0026rsquo;t have to.\u003c/p\u003e\n\u003cp\u003eOverall, I really liked it! I did discover a \u003ca href=\"https://github.com/facundoolano/feedi/pull/99\"\u003esmall typo\u003c/a\u003e which kept feeds from syncing when you clicked the sync button. Though to be fair I shouldn\u0026rsquo;t have needed to click sync, I think it should have imported the initial feeds when I ran \u003ccode\u003emake feed-load\u003c/code\u003e. But that\u0026rsquo;s just a little thing.\u003c/p\u003e\n\u003cp\u003ePython isn\u0026rsquo;t my strongest language so while I can follow along with the code OK I don\u0026rsquo;t feel like I can extend it as I see fit\u0026hellip;\u003c/p\u003e\n\u003ch2 id=\"desire-to-extend\"\u003eDesire to Extend\u003c/h2\u003e\n\u003cp\u003eThis led me to wanting to create my own version of the \u0026ldquo;personal feed reader\u0026rdquo;. Figuring this would be a good project for me to continue practicing my Go.\u003c/p\u003e\n\u003cp\u003eFirst, I made a list of packages that would get me to most of the basic functionality of the feed reader, leaving off Mastodon for now.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/spf13/cobra\"\u003ehttps://github.com/spf13/cobra\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://git.deanishe.net/deanishe/go-favicon\"\u003ehttps://git.deanishe.net/deanishe/go-favicon\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/go-shiori/go-readability\"\u003ehttps://github.com/go-shiori/go-readability\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/go-co-op/gocron\"\u003ehttps://github.com/go-co-op/gocron\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/mmcdole/gofeed\"\u003ehttps://github.com/mmcdole/gofeed\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://github.com/PuerkitoBio/goquery\"\u003ehttps://github.com/PuerkitoBio/goquery\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m going to stick with using \u003ca href=\"https://htmx.org/\"\u003ehtmx\u003c/a\u003e and \u003ca href=\"https://bulma.io/\"\u003eBulma\u003c/a\u003e CSS as it\u0026rsquo;ll be a nice excuse to learn a bit about them.\u003c/p\u003e\n\u003cp\u003eTo start my hacking away on the project I began with using the Cobra command line tools to stand up a basic app. From here I added skeleton commands, \u003ccode\u003eversion\u003c/code\u003e, \u003ccode\u003efeed-load\u003c/code\u003e, \u003ccode\u003eserve\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eversion\u003c/code\u003e - doesn\u0026rsquo;t do much of anything at the moment.\u003cbr\u003e\n\u003ccode\u003efeed-load\u003c/code\u003e - reads a local CSV file and prints out the contents.\u003cbr\u003e\n\u003ccode\u003eserve\u003c/code\u003e - starts the HTTP server on 3000 and is slowly being extended to do other tasks.\u003c/p\u003e\n\u003cp\u003eWhat other tasks, you say?\u003c/p\u003e\n\u003cp\u003eWhile right now running \u003ccode\u003eserve\u003c/code\u003e will start up the web server, begin the scheduler and schedule a dummy job that just says \u003ccode\u003ehello\u003c/code\u003e. It will also load the feed CSV and do some parsing of the included feeds and then use readability on the feed links.\u003c/p\u003e\n\u003ch3 id=\"databasing\"\u003eDatabasing\u003c/h3\u003e\n\u003cp\u003eMy next step is to start working on the database. I need to do some research on properly doing migrations. The Go program/library \u003ca href=\"https://github.com/golang-migrate/migrate/\"\u003e\u003ccode\u003emigrate\u003c/code\u003e\u003c/a\u003e looks like it may be useful in \u003ca href=\"https://github.com/golang-migrate/migrate/blob/master/MIGRATIONS.md\"\u003ethat regard\u003c/a\u003e. At first we\u0026rsquo;ll likely be modeling tables after what\u0026rsquo;s already presented to us as using the base feedi as a design building block.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e0_create_table.down.sql\u003c/code\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-sql\" data-lang=\"sql\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003eDROP\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003eTABLE\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003eIF\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003eEXISTS\u003c/span\u003e feeds;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003e0_create_table.up.sql\u003c/code\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-sql\" data-lang=\"sql\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003eCREATE\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003eTABLE\u003c/span\u003e feeds (\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    id                  \u003cspan style=\"color:#b58900\"\u003eINTEGER\u003c/span\u003e   \u003cspan style=\"color:#719e07\"\u003eNOT\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003eNULL\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    user_id             \u003cspan style=\"color:#b58900\"\u003eINTEGER\u003c/span\u003e   \u003cspan style=\"color:#719e07\"\u003eNOT\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003eNULL\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    url                 \u003cspan style=\"color:#b58900\"\u003eVARCHAR\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003etype\u003c/span\u003e                \u003cspan style=\"color:#b58900\"\u003eVARCHAR\u003c/span\u003e   \u003cspan style=\"color:#719e07\"\u003eNOT\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003eNULL\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    name                \u003cspan style=\"color:#b58900\"\u003eVARCHAR\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    icon_url            \u003cspan style=\"color:#b58900\"\u003eVARCHAR\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    created             \u003cspan style=\"color:#719e07\"\u003eTIMESTAMP\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003eNOT\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003eNULL\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    updated             \u003cspan style=\"color:#719e07\"\u003eTIMESTAMP\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003eNOT\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003eNULL\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    last_fetch          \u003cspan style=\"color:#719e07\"\u003eTIMESTAMP\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    raw_data            \u003cspan style=\"color:#b58900\"\u003eVARCHAR\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    folder              \u003cspan style=\"color:#b58900\"\u003eVARCHAR\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    etag                \u003cspan style=\"color:#b58900\"\u003eVARCHAR\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    modified_header     \u003cspan style=\"color:#b58900\"\u003eVARCHAR\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    filters             \u003cspan style=\"color:#b58900\"\u003eVARCHAR\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    mastodon_account_id \u003cspan style=\"color:#b58900\"\u003eINTEGER\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003ePRIMARY\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003eKEY\u003c/span\u003e (\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        id\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    ),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003eUNIQUE\u003c/span\u003e (\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        user_id,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    )\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWith the up/down files in \u003ccode\u003e./migrations\u003c/code\u003e I should be able to add a command \u003ccode\u003emigrate\u003c/code\u003e and use the library to do the heavy lifting. I think, we\u0026rsquo;ll have to give it a whirl. Maybe I\u0026rsquo;ll write a small test project\u0026hellip;\u003c/p\u003e\n\u003cp\u003eAnd my small test project was a success it seems. If you are interested here is the code.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003epackage\u003c/span\u003e main\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003eimport\u003c/span\u003e (\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;database/sql\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;fmt\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;log\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;github.com/golang-migrate/migrate/v4\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;github.com/golang-migrate/migrate/v4/database/sqlite3\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;github.com/golang-migrate/migrate/v4/source/file\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t_ \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;github.com/mattn/go-sqlite3\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003emain\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#586e75\"\u003e// Connect to database\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\tdb, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e sql.\u003cspan style=\"color:#268bd2\"\u003eOpen\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;sqlite3\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;feeds.db\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tlog.\u003cspan style=\"color:#268bd2\"\u003ePanic\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#586e75\"\u003e// defer close\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\t\u003cspan style=\"color:#719e07\"\u003edefer\u003c/span\u003e db.\u003cspan style=\"color:#268bd2\"\u003eClose\u003c/span\u003e()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tdbDriver, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e sqlite3.\u003cspan style=\"color:#268bd2\"\u003eWithInstance\u003c/span\u003e(db, \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003esqlite3.Config{})\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;instance error: %v \\n\u0026#34;\u003c/span\u003e, err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfileSource, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e (\u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003efile.File{}).\u003cspan style=\"color:#268bd2\"\u003eOpen\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;file://migrations\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;opening file error: %v \\n\u0026#34;\u003c/span\u003e, err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tm, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e migrate.\u003cspan style=\"color:#268bd2\"\u003eNewWithInstance\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;file\u0026#34;\u003c/span\u003e, fileSource, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;feeds.db\u0026#34;\u003c/span\u003e, dbDriver)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;migrate error: %v \\n\u0026#34;\u003c/span\u003e, err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err = m.\u003cspan style=\"color:#268bd2\"\u003eUp\u003c/span\u003e(); err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;migrate up error: %v \\n\u0026#34;\u003c/span\u003e, err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;Migrate up done with success\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n"
    },
    {
      "title": "Getting Reacquainted With Hugo Again",
      "date_published": "2024-06-25T20:55:20-07:00",
      "date_modified": "2024-06-25T20:55:20-07:00",
      "id": "https://shindakun.dev/posts/getting-reacquainted-with-hugo-again/",
      "url": "https://shindakun.dev/posts/getting-reacquainted-with-hugo-again/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003ch2 id=\"testing-testing-testing\"\u003eTesting testing testing\u003c/h2\u003e\n\u003cp\u003eIt\u0026rsquo;s been a bit since I\u0026rsquo;ve looked at my Hugo blog here on \u003ca href=\"https://shindakun.dev\"\u003eshindakun.dev\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eIt happens - life gets in the way of blogging.\u003c/p\u003e\n\u003cp\u003eThe nice thing about having everything in Git and GitHub is that for the most part all I need to do is make sure Hugo is up to date and works on the server. This post is a part of that process.\u003c/p\u003e\n\u003ch2 id=\"hugo\"\u003eHugo\u003c/h2\u003e\n\u003cp\u003eFirst I built Hugo\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e➜  shindakun.dev git:\u003cspan style=\"color:#719e07\"\u003e(\u003c/span\u003emaster\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e ✗ \u003cspan style=\"color:#268bd2\"\u003eCGO_ENABLED\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e go install -tags extended github.com/gohugoio/hugo@latest\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEasy enough!\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e➜  shindakun.dev git:\u003cspan style=\"color:#719e07\"\u003e(\u003c/span\u003emaster\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e ✗ hugo version\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehugo v0.127.0+extended linux/amd64 \u003cspan style=\"color:#268bd2\"\u003eBuildDate\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003eunknown\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eHmm\u0026hellip; unknown build date? I mean I just built it so that should be todays date. Funny though, I have to tell you I don\u0026rsquo;t feel like chasing that down at the moment.\u003c/p\u003e\n\u003ch2 id=\"shindakundev\"\u003eshindakun.dev\u003c/h2\u003e\n\u003cp\u003eNext lets make sure \u003ccode\u003eshindakun.dev\u003c/code\u003e is in a good spot, a quick pull should take care of that.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e➜  shindakun.dev git:\u003cspan style=\"color:#719e07\"\u003e(\u003c/span\u003emaster\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e ✗ git pull --recurse-submodules\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewarning: redirecting to https://github.com/shindakun/shindakun.dev/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFetching submodule content/posts\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFetching submodule themes/solar-theme-hugo\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFetching submodule themes/solara-hugo-test\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAlready up to date.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEverything appears to be in order! Yay.\u003c/p\u003e\n\u003cp\u003eNow we\u0026rsquo;ll just finish up this quick post and close the loop.\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n"
    },
    {
      "title": "Attempting to Learn Go - Ghost to Hugo 4",
      "date_published": "2022-10-01T13:54:29-07:00",
      "date_modified": "2022-10-01T13:54:29-07:00",
      "id": "https://shindakun.dev/posts/attempting-to-learn-go-ghost-to-hugo-4/",
      "url": "https://shindakun.dev/posts/attempting-to-learn-go-ghost-to-hugo-4/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003ch2 id=\"intro\"\u003eIntro\u003c/h2\u003e\n\u003cp\u003eHere we are \u003ca href=\"/posts/attempting-to-learn-go-ghost-to-hugo-3/\"\u003eonce again\u003c/a\u003e! If you missed the last couple of posts I suggest reading them first to get a feeling for how our little prototype has evolved. This time around we\u0026rsquo;re going to be doing some refactoring to clean up a bit. The majority of what we\u0026rsquo;ll be doing is adding methods to our \u0026ldquo;database\u0026rdquo; struct.\u003c/p\u003e\n\u003ch3 id=\"the-method\"\u003eThe Method\u003c/h3\u003e\n\u003cp\u003eWhat is a method? Well, you can think of it as a function that is attached to a struct. Or as \u003ca href=\"https://go.dev/tour/methods/1\"\u003eA Tour of Go\u003c/a\u003e puts it\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA method is a function with a special \u003cem\u003ereceiver\u003c/em\u003e argument.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIn our code we have a struct \u003ccode\u003eGhostDatabase\u003c/code\u003e. We can add methods with the following signature where the receiver is our struct.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e (gd \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003eGhostDatabase) \u003cspan style=\"color:#268bd2\"\u003egetLength\u003c/span\u003e() \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWe could then call the method with the following\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e db GhostDatabase\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003e...\u003c/span\u003eload JSON code here\u003cspan style=\"color:#719e07\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elength \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e db.\u003cspan style=\"color:#268bd2\"\u003egetLength\u003c/span\u003e()\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOK so what\u0026rsquo;s our complete method look like? In the case of most of the methods we\u0026rsquo;ll be putting in place is pretty easy to reason about.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e (gd \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003eGhostDatabase) \u003cspan style=\"color:#268bd2\"\u003egetLength\u003c/span\u003e() \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003elen\u003c/span\u003e(gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"many-methods\"\u003eMany Methods\u003c/h3\u003e\n\u003cp\u003eNow lets quickly knock out some useful methods. For the most part they do what they say on the tin, so I won\u0026rsquo;t go into detail on each one.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e (gd \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003eGhostDatabase) \u003cspan style=\"color:#268bd2\"\u003egetMobiledoc\u003c/span\u003e(i \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e) \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].Mobiledoc\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e (gd \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003eGhostDatabase) \u003cspan style=\"color:#268bd2\"\u003egetPostId\u003c/span\u003e(i \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e) \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].ID\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e (gd \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003eGhostDatabase) \u003cspan style=\"color:#268bd2\"\u003egetPostTitle\u003c/span\u003e(i \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e) \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].Title\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e (gd \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003eGhostDatabase) \u003cspan style=\"color:#268bd2\"\u003egetPostSlug\u003c/span\u003e(i \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e) \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].Slug\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e (gd \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003eGhostDatabase) \u003cspan style=\"color:#268bd2\"\u003egetPostStatus\u003c/span\u003e(i \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e) \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].Status\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e (gd \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003eGhostDatabase) \u003cspan style=\"color:#268bd2\"\u003egetPostCreatedAt\u003c/span\u003e(i \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e) time.Time {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].CreatedAt\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e (gd \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003eGhostDatabase) \u003cspan style=\"color:#268bd2\"\u003egetPostUpdatedAt\u003c/span\u003e(i \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e) time.Time {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].UpdatedAt\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e (gd \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003eGhostDatabase) \u003cspan style=\"color:#268bd2\"\u003egetPostPublishedAt\u003c/span\u003e(i \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e) time.Time {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].PublishedAt\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e (gd \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003eGhostDatabase) \u003cspan style=\"color:#268bd2\"\u003egetPostFeatureImage\u003c/span\u003e(i \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e) \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].FeatureImage\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"tags\"\u003eTags\u003c/h3\u003e\n\u003cp\u003eOne thing that we haven\u0026rsquo;t looked into so far is retrieving the tags associated with a post. Since we\u0026rsquo;re working on adding methods now is a great time to work that out. Let\u0026rsquo;s talk through what we need to do.\u003c/p\u003e\n\u003cp\u003eFirst we need to loop through the \u0026ldquo;database\u0026rdquo; of post tags. From here we check to see if the \u003ccode\u003ePostID\u003c/code\u003e field matches with the post ID, \u003ccode\u003epid\u003c/code\u003e, we pass into the function. We then assign the tag ID to a variable, \u003ccode\u003etagId\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eNext we\u0026rsquo;ll loop our way though the \u003ccode\u003eTags\u003c/code\u003e \u0026ldquo;database\u0026rdquo; and check to see if the current tag id matches with \u003ccode\u003etagId\u003c/code\u003e. If there is a match we append the tag name to a slice \u003ccode\u003er\u003c/code\u003e. Once we\u0026rsquo;re done we return \u003ccode\u003er\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eLet\u0026rsquo;s see what that looks like in practice.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e (gd \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003eGhostDatabase) \u003cspan style=\"color:#268bd2\"\u003egetTags\u003c/span\u003e(pid \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e) []\u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e r []\u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003efor\u003c/span\u003e i \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e; i \u0026lt; \u003cspan style=\"color:#b58900\"\u003elen\u003c/span\u003e(gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.PostsTags); i\u003cspan style=\"color:#719e07\"\u003e++\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.PostsTags[i].PostID \u003cspan style=\"color:#719e07\"\u003e==\u003c/span\u003e pid {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\ttagId \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.PostsTags[i].TagID\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\u003cspan style=\"color:#719e07\"\u003efor\u003c/span\u003e j \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e; j \u0026lt; \u003cspan style=\"color:#b58900\"\u003elen\u003c/span\u003e(gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Tags); j\u003cspan style=\"color:#719e07\"\u003e++\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Tags[j].ID \u003cspan style=\"color:#719e07\"\u003e==\u003c/span\u003e tagId {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\t\tr = \u003cspan style=\"color:#b58900\"\u003eappend\u003c/span\u003e(r, gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Tags[j].Name)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e r\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNot to shabby.\u003c/p\u003e\n\u003ch3 id=\"next-time\"\u003eNext Time\u003c/h3\u003e\n\u003cp\u003eThat\u0026rsquo;s all of our methods for now. With them out of the way I believe we have all the parts need to actually start writing our Markdown files!\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch3 id=\"code-listing\"\u003eCode Listing\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003epackage\u003c/span\u003e main\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003eimport\u003c/span\u003e (\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;encoding/json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;fmt\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;io\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;os\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;reflect\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;strconv\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;strings\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;time\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003etype\u003c/span\u003e GhostDatabase \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tDb []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tMeta \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tExportedOn \u003cspan style=\"color:#dc322f\"\u003eint64\u003c/span\u003e  \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;exported_on\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tVersion    \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;version\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;meta\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tData \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tPosts []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID                   \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUUID                 \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;uuid\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTitle                \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tSlug                 \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;slug\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tMobiledoc            \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;mobiledoc\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tHTML                 \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;html\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCommentID            \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;comment_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tPlaintext            \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;plaintext\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tFeatureImage         \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;feature_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tFeatured             \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e         \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;featured\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tType                 \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;type\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tStatus               \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;status\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tLocale               \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;locale\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tVisibility           \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;visibility\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tEmailRecipientFilter \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;email_recipient_filter\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tAuthorID             \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;author_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCreatedAt            time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;created_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUpdatedAt            time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;updated_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tPublishedAt          time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;published_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCustomExcerpt        \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;custom_excerpt\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCodeinjectionHead    \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;codeinjection_head\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCodeinjectionFoot    \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;codeinjection_foot\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCustomTemplate       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;custom_template\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCanonicalURL         \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;canonical_url\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;posts\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tPostsAuthors []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID        \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tPostID    \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;post_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tAuthorID  \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;author_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tSortOrder \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;sort_order\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;posts_authors\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tPostsMeta []\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;posts_meta\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tPostsTags []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID        \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tPostID    \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;post_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTagID     \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;tag_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tSortOrder \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;sort_order\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;posts_tags\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tRoles []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID          \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tName        \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;name\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tDescription \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCreatedAt   time.Time \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;created_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUpdatedAt   time.Time \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;updated_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;roles\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tRolesUsers []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID     \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tRoleID \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;role_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUserID \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;user_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;roles_users\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tSettings []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID        \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tGroup     \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;group\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tKey       \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;key\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tValue     \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;value\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tType      \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;type\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tFlags     \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;flags\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCreatedAt time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;created_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUpdatedAt time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;updated_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;settings\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tTags []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID                 \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tName               \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;name\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tSlug               \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;slug\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tDescription        \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tFeatureImage       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;feature_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tParentID           \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;parent_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tVisibility         \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;visibility\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tOgImage            \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;og_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tOgTitle            \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;og_title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tOgDescription      \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;og_description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTwitterImage       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;twitter_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTwitterTitle       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;twitter_title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTwitterDescription \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;twitter_description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tMetaTitle          \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;meta_title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tMetaDescription    \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;meta_description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCodeinjectionHead  \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;codeinjection_head\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCodeinjectionFoot  \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;codeinjection_foot\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCanonicalURL       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;canonical_url\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tAccentColor        \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;accent_color\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCreatedAt          time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;created_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUpdatedAt          time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;updated_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;tags\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tUsers []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID              \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tName            \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;name\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tSlug            \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;slug\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tPassword        \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;password\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tEmail           \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;email\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tProfileImage    \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;profile_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCoverImage      \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;cover_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tBio             \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;bio\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tWebsite         \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;website\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tLocation        \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;location\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tFacebook        \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;facebook\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTwitter         \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;twitter\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tAccessibility   \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;accessibility\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tStatus          \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;status\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tLocale          \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;locale\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tVisibility      \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;visibility\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tMetaTitle       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;meta_title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tMetaDescription \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;meta_description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTour            \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;tour\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tLastSeen        time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;last_seen\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCreatedAt       time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;created_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUpdatedAt       time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;updated_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;users\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;data\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;db\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003etype\u003c/span\u003e Mobiledoc \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tVersion      \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e          \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;version\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tMarkups      []\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{}   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;markups\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tAtoms        []\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{}   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;atoms\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tCards        [][]\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;cards\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tSections     [][]\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;sections\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tGhostVersion \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e          \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;ghostVersion\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e (gd \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003eGhostDatabase) \u003cspan style=\"color:#268bd2\"\u003egetLength\u003c/span\u003e() \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003elen\u003c/span\u003e(gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e (gd \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003eGhostDatabase) \u003cspan style=\"color:#268bd2\"\u003egetMobiledoc\u003c/span\u003e(i \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e) \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].Mobiledoc\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e (gd \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003eGhostDatabase) \u003cspan style=\"color:#268bd2\"\u003egetPostId\u003c/span\u003e(i \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e) \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].ID\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e (gd \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003eGhostDatabase) \u003cspan style=\"color:#268bd2\"\u003egetPostTitle\u003c/span\u003e(i \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e) \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].Title\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e (gd \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003eGhostDatabase) \u003cspan style=\"color:#268bd2\"\u003egetPostSlug\u003c/span\u003e(i \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e) \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].Slug\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e (gd \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003eGhostDatabase) \u003cspan style=\"color:#268bd2\"\u003egetPostStatus\u003c/span\u003e(i \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e) \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].Status\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e (gd \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003eGhostDatabase) \u003cspan style=\"color:#268bd2\"\u003egetPostCreatedAt\u003c/span\u003e(i \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e) time.Time {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].CreatedAt\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e (gd \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003eGhostDatabase) \u003cspan style=\"color:#268bd2\"\u003egetPostUpdatedAt\u003c/span\u003e(i \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e) time.Time {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].UpdatedAt\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e (gd \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003eGhostDatabase) \u003cspan style=\"color:#268bd2\"\u003egetPostPublishedAt\u003c/span\u003e(i \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e) time.Time {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].PublishedAt\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e (gd \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003eGhostDatabase) \u003cspan style=\"color:#268bd2\"\u003egetPostFeatureImage\u003c/span\u003e(i \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e) \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].FeatureImage\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e (gd \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003eGhostDatabase) \u003cspan style=\"color:#268bd2\"\u003egetTags\u003c/span\u003e(pid \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e) []\u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e r []\u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003efor\u003c/span\u003e i \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e; i \u0026lt; \u003cspan style=\"color:#b58900\"\u003elen\u003c/span\u003e(gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.PostsTags); i\u003cspan style=\"color:#719e07\"\u003e++\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.PostsTags[i].PostID \u003cspan style=\"color:#719e07\"\u003e==\u003c/span\u003e pid {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\ttagId \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.PostsTags[i].TagID\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\u003cspan style=\"color:#719e07\"\u003efor\u003c/span\u003e j \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e; j \u0026lt; \u003cspan style=\"color:#b58900\"\u003elen\u003c/span\u003e(gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Tags); j\u003cspan style=\"color:#719e07\"\u003e++\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Tags[j].ID \u003cspan style=\"color:#719e07\"\u003e==\u003c/span\u003e tagId {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\t\tr = \u003cspan style=\"color:#b58900\"\u003eappend\u003c/span\u003e(r, gd.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Tags[j].Name)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e r\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003emain\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;ghost2hugo\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfile, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e os.\u003cspan style=\"color:#268bd2\"\u003eOpen\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;shindakun-dot-net.ghost.2022-03-18-22-02-58.json\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003edefer\u003c/span\u003e file.\u003cspan style=\"color:#268bd2\"\u003eClose\u003c/span\u003e()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tb, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e io.\u003cspan style=\"color:#268bd2\"\u003eReadAll\u003c/span\u003e(file)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e db GhostDatabase\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\terr = json.\u003cspan style=\"color:#268bd2\"\u003eUnmarshal\u003c/span\u003e(b, \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003edb)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003efor\u003c/span\u003e i \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e; i \u0026lt; db.\u003cspan style=\"color:#268bd2\"\u003egetLength\u003c/span\u003e(); i\u003cspan style=\"color:#719e07\"\u003e++\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(db.\u003cspan style=\"color:#268bd2\"\u003egetPostTitle\u003c/span\u003e(i))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(db.\u003cspan style=\"color:#268bd2\"\u003egetPostSlug\u003c/span\u003e(i))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(db.\u003cspan style=\"color:#268bd2\"\u003egetPostStatus\u003c/span\u003e(i))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(db.\u003cspan style=\"color:#268bd2\"\u003egetPostCreatedAt\u003c/span\u003e(i))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(db.\u003cspan style=\"color:#268bd2\"\u003egetPostUpdatedAt\u003c/span\u003e(i))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(db.\u003cspan style=\"color:#268bd2\"\u003egetPostPublishedAt\u003c/span\u003e(i))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(db.\u003cspan style=\"color:#268bd2\"\u003egetPostFeatureImage\u003c/span\u003e(i))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tid \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e db.\u003cspan style=\"color:#268bd2\"\u003egetPostId\u003c/span\u003e(i)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\ttags \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e db.\u003cspan style=\"color:#268bd2\"\u003egetTags\u003c/span\u003e(id)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(tags)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tc \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e strings.\u003cspan style=\"color:#268bd2\"\u003eReplaceAll\u003c/span\u003e(db.\u003cspan style=\"color:#268bd2\"\u003egetMobiledoc\u003c/span\u003e(i), \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;`\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;%\u0026#39;\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tcc \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;`\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e c \u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;`\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tucn, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e strconv.\u003cspan style=\"color:#268bd2\"\u003eUnquote\u003c/span\u003e(cc)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err, ucn)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tucn = strings.\u003cspan style=\"color:#268bd2\"\u003eReplaceAll\u003c/span\u003e(ucn, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;%\u0026#39;\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;`\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e md Mobiledoc\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\terr = json.\u003cspan style=\"color:#268bd2\"\u003eUnmarshal\u003c/span\u003e([]\u003cspan style=\"color:#b58900\"\u003ebyte\u003c/span\u003e(ucn), \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003emd)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e reflect.\u003cspan style=\"color:#268bd2\"\u003eValueOf\u003c/span\u003e(md.Cards).\u003cspan style=\"color:#268bd2\"\u003eLen\u003c/span\u003e() \u0026gt; \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tcard \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e md.Cards[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e][\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tbbb \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e card.(\u003cspan style=\"color:#268bd2\"\u003emap\u003c/span\u003e[\u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e]\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{})\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(bbb[\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;markdown\u0026#34;\u003c/span\u003e])\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;---\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
    },
    {
      "title": "Attempting to Learn Go - Ghost to Hugo 3",
      "date_published": "2022-09-27T17:00:05-07:00",
      "date_modified": "2022-09-27T17:00:05-07:00",
      "id": "https://shindakun.dev/posts/attempting-to-learn-go-ghost-to-hugo-3/",
      "url": "https://shindakun.dev/posts/attempting-to-learn-go-ghost-to-hugo-3/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003ch2 id=\"intro\"\u003eIntro\u003c/h2\u003e\n\u003cp\u003eWe\u0026rsquo;re \u003ca href=\"/posts/attempting-to-learn-go-ghost-to-hugo-2\"\u003eback once again\u003c/a\u003e to continue our work on the \u003ccode\u003eghost2hugo\u003c/code\u003e prototype. So far we can open the JSON file, load the data into memory, and print out the Markdown for the first post. The next step is to make sure we can read and process every post included in the backup.\u003c/p\u003e\n\u003ch3 id=\"looping\"\u003eLooping\u003c/h3\u003e\n\u003cp\u003eWe\u0026rsquo;re going to replace all the code that prints a single article with a loop that prints out each article. For a refresher, here is the code that prints the first article.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tc \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;`\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e db.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Mobiledoc \u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;`\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tun, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e strconv.\u003cspan style=\"color:#268bd2\"\u003eUnquote\u003c/span\u003e(c)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;%v\u0026#34;\u003c/span\u003e, un)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e md Mobiledoc\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\terr = json.\u003cspan style=\"color:#268bd2\"\u003eUnmarshal\u003c/span\u003e([]\u003cspan style=\"color:#b58900\"\u003ebyte\u003c/span\u003e(un), \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003emd)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;%#v\u0026#34;\u003c/span\u003e, md)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tcard \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e md.Cards[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e][\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\\n\\ncard: %#v\\n\u0026#34;\u003c/span\u003e, card)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tbbb \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e card.(\u003cspan style=\"color:#268bd2\"\u003emap\u003c/span\u003e[\u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e]\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{})\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(bbb[\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;markdown\u0026#34;\u003c/span\u003e])\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eMost of this will live inside of our new loop.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003efor\u003c/span\u003e i \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e; i \u0026lt; \u003cspan style=\"color:#b58900\"\u003elen\u003c/span\u003e(db.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts); i\u003cspan style=\"color:#719e07\"\u003e++\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(db.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].Title)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(db.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].Slug)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(db.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].Status)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(db.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].CreatedAt)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(db.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].UpdatedAt)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tcc \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;`\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e db.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].Mobiledoc \u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;`\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tucn, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e strconv.\u003cspan style=\"color:#268bd2\"\u003eUnquote\u003c/span\u003e(cc)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err, ucn)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\\n\\n\\n%v\\n\\n\\n\u0026#34;\u003c/span\u003e, ucn)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e md Mobiledoc\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\terr = json.\u003cspan style=\"color:#268bd2\"\u003eUnmarshal\u003c/span\u003e([]\u003cspan style=\"color:#b58900\"\u003ebyte\u003c/span\u003e(ucn), \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003emd)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tcard \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e md.Cards[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e][\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tbbb \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e card.(\u003cspan style=\"color:#268bd2\"\u003emap\u003c/span\u003e[\u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e]\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{})\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(bbb[\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;markdown\u0026#34;\u003c/span\u003e])\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAnd when we run the code this time we see a bunch of articles fly by! Until, that is, we hit an error! The \u003ccode\u003einvalid syntax\u003c/code\u003e error indicates this is a problem with \u003ccode\u003estrconv.Unquote()\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003einvalid syntax \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eunexpected end of JSON input\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epanic: runtime error: index out of range \u003cspan style=\"color:#719e07\"\u003e[\u003c/span\u003e0\u003cspan style=\"color:#719e07\"\u003e]\u003c/span\u003e with length \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egoroutine \u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e[\u003c/span\u003erunning\u003cspan style=\"color:#719e07\"\u003e]\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emain.main\u003cspan style=\"color:#719e07\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        /Users/steve/Code/ghost2hugo/main.go:214 +0x769\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#b58900\"\u003eexit\u003c/span\u003e status \u003cspan style=\"color:#2aa198\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"roadblocks\"\u003eRoadblocks\u003c/h3\u003e\n\u003cp\u003eWell that\u0026rsquo;s no good, we can\u0026rsquo;t just have our code crash out like that! Let\u0026rsquo;s take a closer look at the problem and see if we can work our way through it. OK, now for the master of all debugging techniques! We add a \u003ccode\u003efmt.Println\u003c/code\u003e to print out the chunk of text.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(cc)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eRunning the code again we crash out as expected but this time we\u0026rsquo;re presented with the problem text:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e`{\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;version\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;0.3.1\u0026#34;\u003c/span\u003e,\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;markups\u0026#34;\u003c/span\u003e:[],\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;atoms\u0026#34;\u003c/span\u003e:[],\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;cards\u0026#34;\u003c/span\u003e:[[\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;markdown\u0026#34;\u003c/span\u003e,{\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;cardName\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;card-markdown\u0026#34;\u003c/span\u003e,\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;markdown\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\\n* Incresed title to 64 characters. Should be more then enough.  \\n * ics and other code work over at angstridden dot net tonight.\\n\\nALTER TABLE `posts` CHANGE `posttitle` `posttitle` VARCHAR( 64 ) NOT NULL\\n\\n\\n\u0026#34;\u003c/span\u003e}]],\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;sections\u0026#34;\u003c/span\u003e:[[\u003cspan style=\"color:#2aa198\"\u003e10\u003c/span\u003e,\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e]],\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;ghostVersion\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;3.0\u0026#34;\u003c/span\u003e}`\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSee the problem? Yeah, it looks like there are back ticks in the Markdown that are causing the string convert to not work as expected. To get around this we\u0026rsquo;re going to do a simple \u003ccode\u003estrings.ReplaceAll\u003c/code\u003e before the conversion to change the back tick to something else. We can then reverse that process to get the normal text. We\u0026rsquo;ll replace the back tick with \u0026ldquo;\u003ccode\u003e%'\u003c/code\u003e\u0026rdquo;.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tc \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e strings.\u003cspan style=\"color:#268bd2\"\u003eReplaceAll\u003c/span\u003e(db.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].Mobiledoc, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;`\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;%\u0026#39;\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tcc \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;`\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e c \u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;`\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAfter we \u0026ldquo;unquote\u0026rdquo; we can run another \u003ccode\u003estrings.ReplaceAll\u003c/code\u003e to convert back.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tucn = strings.\u003cspan style=\"color:#268bd2\"\u003eReplaceAll\u003c/span\u003e(ucn, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;%\u0026#39;\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;`\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eRunning again we run into another problem!\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eArchives\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003earchives-post\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epublished\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e2007-07-01 09:46:18 +0000 UTC\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e2007-08-12 20:50:02 +0000 UTC\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e`{\u0026#34;version\u0026#34;:\u0026#34;0.3.1\u0026#34;,\u0026#34;markups\u0026#34;:[],\u0026#34;atoms\u0026#34;:[],\u0026#34;cards\u0026#34;:[],\u0026#34;sections\u0026#34;:[[1,\u0026#34;p\u0026#34;,[[0,[],0,\u0026#34;\u0026#34;]]]],\u0026#34;ghostVersion\u0026#34;:\u0026#34;3.0\u0026#34;}`\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epanic: runtime error: index out of range [0] with length 0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egoroutine 1 [running]:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emain.main()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        /Users/steve/Code/ghost2hugo/main.go:214 +0x7a6\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eexit status 2\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eArgh!\u003c/p\u003e\n\u003ch3 id=\"more-roadblocks\"\u003eMore Roadblocks\u003c/h3\u003e\n\u003cp\u003eOur naive implementation from the previous post has returned to bite us! We were assuming that cards exist.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tcard \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e md.Cards[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e][\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tbbb \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e card.(\u003cspan style=\"color:#268bd2\"\u003emap\u003c/span\u003e[\u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e]\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{})\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLooking at the returned JSON confirms this.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;version\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;0.3.1\u0026#34;\u003c/span\u003e,\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;markups\u0026#34;\u003c/span\u003e:[],\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;atoms\u0026#34;\u003c/span\u003e:[],\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;cards\u0026#34;\u003c/span\u003e:[],\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;sections\u0026#34;\u003c/span\u003e:[[\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e,\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;p\u0026#34;\u003c/span\u003e,[[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e,[],\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e,\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e]]]],\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;ghostVersion\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;3.0\u0026#34;\u003c/span\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNow, how do we check to see if the cards field is empty?! I noodled on it a little bit and figured the best way would be to use \u003ccode\u003ereflect.ValueOf().Len()\u003c/code\u003e. This will check the length of \u003ccode\u003emd.Cards\u003c/code\u003e to ensure we actually have some data.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e reflect.\u003cspan style=\"color:#268bd2\"\u003eValueOf\u003c/span\u003e(md.Cards).\u003cspan style=\"color:#268bd2\"\u003eLen\u003c/span\u003e() \u0026gt; \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tcard \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e md.Cards[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e][\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tbbb \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e card.(\u003cspan style=\"color:#268bd2\"\u003emap\u003c/span\u003e[\u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e]\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{})\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(bbb[\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;markdown\u0026#34;\u003c/span\u003e])\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOn rerunning we get what looks to be all the posts. Except the final draft which looks odd! It turns out this one has no Markdown card. Is this the only one? I certainly hope so since it looks like it may be a pain to convert to Markdown.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eQuesting\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003equesting\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edraft\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e2019-08-23 21:26:44 +0000 UTC\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e2021-04-12 04:53:26 +0000 UTC\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e`{\u0026#34;version\u0026#34;:\u0026#34;0.3.1\u0026#34;,\u0026#34;atoms\u0026#34;:[],\u0026#34;cards\u0026#34;:[[\u0026#34;paywall\u0026#34;,{}]],\u0026#34;markups\u0026#34;:[[\u0026#34;a\u0026#34;,[\u0026#34;href\u0026#34;,\u0026#34;https://shindakun.dev\u0026#34;]],[\u0026#34;a\u0026#34;,[\u0026#34;href\u0026#34;,\u0026#34;https://dev.to/shindakun\u0026#34;]]],\u0026#34;sections\u0026#34;:[[1,\u0026#34;p\u0026#34;,[[0,[],0,\u0026#34;It\u0026#39;s been quite sometime since I\u0026#39;ve posted anything here. I\u0026#39;ve done a bit of posting over on \u0026#34;],[0,[0],1,\u0026#34;shindakun.dev\u0026#34;],[0,[],0,\u0026#34; and over on \u0026#34;],[0,[1],1,\u0026#34;DEV\u0026#34;],[0,[],0,\u0026#34; which has been kind of nice. But, those don\u0026#39;t really cover gaming at all. But, I updated the site recently and everyone once in a while I use the site to try something out for work and seeing an old post over and over was no good.\u0026#34;]]],[1,\u0026#34;p\u0026#34;,[[0,[],0,\u0026#34;I only seem to have a small sliver of time for gaming now. With everything else I want/need to get done there is only so much time. Heed this warning - don\u0026#39;t get older! Just kidding, it\u0026#39;s not so bad.\u0026#34;]]],[1,\u0026#34;p\u0026#34;,[[0,[],0,\u0026#34;My 5 year old hasn\u0026#39;t been introduced into gaming much outside of some basic games she can play on her tablet. I have discovered that she enjoys watching me play the digital version of Warhammer Quest. Which is good since she\u0026#39;s going to be getting a crash course in some more difficult board games sooner or later. I have a copy of the Gloomhaven digital board game and the boxed game (and expansion) but haven\u0026#39;t actually event opened it yet. Maybe I should fix that this weekend...\u0026#34;]]],[10,0],[1,\u0026#34;p\u0026#34;,[]]],\u0026#34;ghostVersion\u0026#34;:\u0026#34;3.0\u0026#34;}`\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ejson: cannot unmarshal string into Go struct field Mobiledoc.sections of type int\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;nil\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLooks like we also have an issue unmarshaling, on that last line there. This is easy enough to fix for now. We just need to update \u003ccode\u003esections\u003c/code\u003e in our \u003ccode\u003eMobiledoc\u003c/code\u003e \u003ccode\u003estruct\u003c/code\u003e to use \u003ccode\u003e[][]interface{}\u003c/code\u003e and not \u003ccode\u003e[][]int\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003etype\u003c/span\u003e Mobiledoc \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tVersion      \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e          \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;version\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tMarkups      []\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{}   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;markups\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tAtoms        []\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{}   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;atoms\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tCards        [][]\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;cards\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tSections     [][]\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;sections\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tGhostVersion \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e          \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;ghostVersion\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"next-time\"\u003eNext Time\u003c/h3\u003e\n\u003cp\u003eWe\u0026rsquo;ve made some good progress over the last few posts. On the first look it seems we\u0026rsquo;re extracting what we need. I think we\u0026rsquo;re ready to do a little refactoring, remove our current debug print statements, and get ready for the next part of our converter.\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch3 id=\"code-listing\"\u003eCode Listing\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003epackage\u003c/span\u003e main\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003eimport\u003c/span\u003e (\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;encoding/json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;fmt\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;io\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;os\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;reflect\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;strconv\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;strings\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;time\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003etype\u003c/span\u003e GhostDatabase \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tDb []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tMeta \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tExportedOn \u003cspan style=\"color:#dc322f\"\u003eint64\u003c/span\u003e  \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;exported_on\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tVersion    \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;version\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;meta\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tData \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tPosts []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID                   \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUUID                 \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;uuid\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTitle                \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tSlug                 \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;slug\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tMobiledoc            \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;mobiledoc\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tHTML                 \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;html\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCommentID            \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;comment_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tPlaintext            \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;plaintext\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tFeatureImage         \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;feature_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tFeatured             \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e         \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;featured\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tType                 \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;type\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tStatus               \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;status\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tLocale               \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;locale\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tVisibility           \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;visibility\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tEmailRecipientFilter \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;email_recipient_filter\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tAuthorID             \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;author_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCreatedAt            time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;created_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUpdatedAt            time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;updated_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tPublishedAt          time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;published_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCustomExcerpt        \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;custom_excerpt\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCodeinjectionHead    \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;codeinjection_head\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCodeinjectionFoot    \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;codeinjection_foot\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCustomTemplate       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;custom_template\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCanonicalURL         \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;canonical_url\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;posts\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tPostsAuthors []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID        \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tPostID    \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;post_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tAuthorID  \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;author_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tSortOrder \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;sort_order\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;posts_authors\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tPostsMeta []\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;posts_meta\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tPostsTags []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID        \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tPostID    \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;post_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTagID     \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;tag_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tSortOrder \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;sort_order\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;posts_tags\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tRoles []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID          \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tName        \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;name\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tDescription \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCreatedAt   time.Time \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;created_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUpdatedAt   time.Time \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;updated_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;roles\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tRolesUsers []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID     \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tRoleID \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;role_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUserID \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;user_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;roles_users\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tSettings []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID        \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tGroup     \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;group\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tKey       \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;key\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tValue     \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;value\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tType      \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;type\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tFlags     \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;flags\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCreatedAt time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;created_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUpdatedAt time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;updated_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;settings\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tTags []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID                 \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tName               \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;name\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tSlug               \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;slug\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tDescription        \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tFeatureImage       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;feature_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tParentID           \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;parent_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tVisibility         \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;visibility\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tOgImage            \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;og_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tOgTitle            \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;og_title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tOgDescription      \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;og_description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTwitterImage       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;twitter_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTwitterTitle       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;twitter_title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTwitterDescription \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;twitter_description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tMetaTitle          \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;meta_title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tMetaDescription    \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;meta_description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCodeinjectionHead  \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;codeinjection_head\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCodeinjectionFoot  \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;codeinjection_foot\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCanonicalURL       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;canonical_url\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tAccentColor        \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;accent_color\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCreatedAt          time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;created_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUpdatedAt          time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;updated_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;tags\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tUsers []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID              \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tName            \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;name\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tSlug            \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;slug\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tPassword        \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;password\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tEmail           \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;email\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tProfileImage    \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;profile_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCoverImage      \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;cover_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tBio             \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;bio\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tWebsite         \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;website\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tLocation        \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;location\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tFacebook        \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;facebook\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTwitter         \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;twitter\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tAccessibility   \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;accessibility\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tStatus          \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;status\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tLocale          \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;locale\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tVisibility      \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;visibility\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tMetaTitle       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;meta_title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tMetaDescription \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;meta_description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTour            \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;tour\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tLastSeen        time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;last_seen\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCreatedAt       time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;created_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUpdatedAt       time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;updated_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;users\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;data\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;db\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003etype\u003c/span\u003e Mobiledoc \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tVersion      \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e          \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;version\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tMarkups      []\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{}   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;markups\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tAtoms        []\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{}   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;atoms\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tCards        [][]\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;cards\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tSections     [][]\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;sections\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tGhostVersion \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e          \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;ghostVersion\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003emain\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;ghost2hugo\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfile, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e os.\u003cspan style=\"color:#268bd2\"\u003eOpen\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;shindakun-dot-net.ghost.2022-03-18-22-02-58.json\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003edefer\u003c/span\u003e file.\u003cspan style=\"color:#268bd2\"\u003eClose\u003c/span\u003e()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tb, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e io.\u003cspan style=\"color:#268bd2\"\u003eReadAll\u003c/span\u003e(file)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e db GhostDatabase\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\terr = json.\u003cspan style=\"color:#268bd2\"\u003eUnmarshal\u003c/span\u003e(b, \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003edb)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003efor\u003c/span\u003e i \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e; i \u0026lt; \u003cspan style=\"color:#b58900\"\u003elen\u003c/span\u003e(db.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts); i\u003cspan style=\"color:#719e07\"\u003e++\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(db.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].Title)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(db.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].Slug)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(db.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].Status)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(db.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].CreatedAt)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(db.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].UpdatedAt)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tc \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e strings.\u003cspan style=\"color:#268bd2\"\u003eReplaceAll\u003c/span\u003e(db.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[i].Mobiledoc, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;`\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;%\u0026#39;\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tcc \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;`\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e c \u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;`\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(cc)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tucn, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e strconv.\u003cspan style=\"color:#268bd2\"\u003eUnquote\u003c/span\u003e(cc)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err, ucn)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tucn = strings.\u003cspan style=\"color:#268bd2\"\u003eReplaceAll\u003c/span\u003e(ucn, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;%\u0026#39;\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;`\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e md Mobiledoc\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\terr = json.\u003cspan style=\"color:#268bd2\"\u003eUnmarshal\u003c/span\u003e([]\u003cspan style=\"color:#b58900\"\u003ebyte\u003c/span\u003e(ucn), \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003emd)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e reflect.\u003cspan style=\"color:#268bd2\"\u003eValueOf\u003c/span\u003e(md.Cards).\u003cspan style=\"color:#268bd2\"\u003eLen\u003c/span\u003e() \u0026gt; \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tcard \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e md.Cards[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e][\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tbbb \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e card.(\u003cspan style=\"color:#268bd2\"\u003emap\u003c/span\u003e[\u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e]\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{})\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(bbb[\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;markdown\u0026#34;\u003c/span\u003e])\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;---\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
    },
    {
      "title": "Attempting to Learn Go - Ghost to Hugo 2",
      "date_published": "2022-09-22T19:27:29-07:00",
      "date_modified": "2022-09-22T19:27:29-07:00",
      "id": "https://shindakun.dev/posts/attempting-to-learn-go-ghost-to-hugo-2/",
      "url": "https://shindakun.dev/posts/attempting-to-learn-go-ghost-to-hugo-2/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003ch2 id=\"intro\"\u003eIntro\u003c/h2\u003e\n\u003cp\u003eWelcome back! We are \u003ca href=\"/posts/attempting-to-learn-go-ghost-to-hugo-1\"\u003econtinuing\u003c/a\u003e on our journey to make a prototype program that converts an exported Ghost database to Markdown. With the end goal being that we can get \u003ca href=\"https://shindakun.net\"\u003eshindakun.net\u003c/a\u003e up and running with Hugo. Last time, we took it pretty easy and focused mostly on reading the file into memory and converting the JSON to a Go struct. From there we printed out the first post.\u003c/p\u003e\n\u003ch3 id=\"post-data\"\u003ePost Data\u003c/h3\u003e\n\u003cp\u003eAs a recap here is what one of the post fields contain.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;id\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;60710b90705967038fe662d6\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;uuid\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;71ba3d71-ac18-4f33-82f7-1962baa83a07\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;db test\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;slug\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;db-test\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;mobiledoc\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;{\\\u0026#34;version\\\u0026#34;:\\\u0026#34;0.3.1\\\u0026#34;,\\\u0026#34;markups\\\u0026#34;:[],\\\u0026#34;atoms\\\u0026#34;:[],\\\u0026#34;cards\\\u0026#34;:[[\\\u0026#34;markdown\\\u0026#34;,{\\\u0026#34;cardName\\\u0026#34;:\\\u0026#34;card-markdown\\\u0026#34;,\\\u0026#34;markdown\\\u0026#34;:\\\u0026#34;\\\\n\u0026lt;strike\u0026gt;This is a db test\u0026lt;/strike\u0026gt;.\\\\n\\\u0026#34;}]],\\\u0026#34;sections\\\u0026#34;:[[10,0]],\\\u0026#34;ghostVersion\\\u0026#34;:\\\u0026#34;3.0\\\u0026#34;}\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;html\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\u0026lt;!--kg-card-begin: markdown--\u0026gt;\u0026lt;p\u0026gt;\u0026lt;strike\u0026gt;This is a db test\u0026lt;/strike\u0026gt;.\u0026lt;/p\u0026gt;\\n\u0026lt;!--kg-card-end: markdown--\u0026gt;\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;comment_id\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;2\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;plaintext\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;This is a db test.\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;feature_image\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#cb4b16\"\u003enull\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;featured\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;post\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;status\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;published\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;locale\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#cb4b16\"\u003enull\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;visibility\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;public\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;email_recipient_filter\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;none\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;author_id\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;60710b8d705967038fe66214\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;created_at\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;2004-08-09T19:11:20.000Z\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;updated_at\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;2004-08-09T19:11:20.000Z\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;published_at\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;2004-08-09T19:11:20.000Z\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;custom_excerpt\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#cb4b16\"\u003enull\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;codeinjection_head\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#cb4b16\"\u003enull\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;codeinjection_foot\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#cb4b16\"\u003enull\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;custom_template\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#cb4b16\"\u003enull\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;canonical_url\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#cb4b16\"\u003enull\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e},\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThe majority of the fields we need to craft a post with appropriate frontmatter exist within this the object we\u0026rsquo;re getting back. We can see the title, slug, published date, etc. The section that contains the Markdown is in a format known as Mobiledoc.\u003c/p\u003e\n\u003ch3 id=\"mobiledoc\"\u003eMobiledoc\u003c/h3\u003e\n\u003cp\u003eAccording to the Ghost documentation Mobiledoc is\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026hellip;a standardised JSON-based document storage format, which forms the heart of publishing with Ghost.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWhen extracted from the JSON object and cleaned up we\u0026rsquo;ll have another bit of JSON we can work with.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;version\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;0.3.1\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;markups\u0026#34;\u003c/span\u003e: [],\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;atoms\u0026#34;\u003c/span\u003e: [],\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;cards\u0026#34;\u003c/span\u003e: [\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        [\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;markdown\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;cardName\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;card-markdown\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;markdown\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\\n\u0026lt;strike\u0026gt;This is a db test\u0026lt;/strike\u0026gt;.\\n\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        ]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    ],\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;sections\u0026#34;\u003c/span\u003e: [\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        [\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#2aa198\"\u003e10\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        ]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    ],\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;ghostVersion\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;3.0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"sounds-easy\"\u003eSounds Easy\u003c/h3\u003e\n\u003cp\u003eFirst we\u0026rsquo;ll use our favorite site, the \u003ca href=\"https://mholt.github.io/json-to-go/\"\u003eJSON to Go\u003c/a\u003e converter to convert the JSON object to a struct we can work with.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003etype\u003c/span\u003e Mobiledoc \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tVersion      \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e          \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;version\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tMarkups      []\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{}   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;markups\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tAtoms        []\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{}   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;atoms\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tCards        [][]\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;cards\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tSections     [][]\u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e         \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;sections\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tGhostVersion \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e          \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;ghostVersion\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOur code is pretty long now so I\u0026rsquo;m going to leave out the other struct \u003ccode\u003eGhostDatabase\u003c/code\u003e struct, it\u0026rsquo;ll be in the complete code listing below though. We\u0026rsquo;re still going to be dumping code to the screen  since we\u0026rsquo;re still working on our decoding logic.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003epackage\u003c/span\u003e main\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003eimport\u003c/span\u003e (\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;encoding/json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;fmt\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;io\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;os\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;strconv\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;time\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003etype\u003c/span\u003e GhostDatabase \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\u003cspan style=\"color:#719e07\"\u003e...\u003c/span\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003etype\u003c/span\u003e Mobiledoc \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tVersion      \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e          \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;version\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tMarkups      []\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{}   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;markups\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tAtoms        []\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{}   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;atoms\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tCards        [][]\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;cards\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tSections     [][]\u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e         \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;sections\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tGhostVersion \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e          \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;ghostVersion\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003emain\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;ghost2hugo\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfile, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e os.\u003cspan style=\"color:#268bd2\"\u003eOpen\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;shindakun-dot-net.ghost.2022-03-18-22-02-58.json\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003edefer\u003c/span\u003e file.\u003cspan style=\"color:#268bd2\"\u003eClose\u003c/span\u003e()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tb, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e io.\u003cspan style=\"color:#268bd2\"\u003eReadAll\u003c/span\u003e(file)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e db GhostDatabase\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\terr = json.\u003cspan style=\"color:#268bd2\"\u003eUnmarshal\u003c/span\u003e(b, \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003edb)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLet\u0026rsquo;s continue to focus on the first post for now since once we have that working it should just be a matter of looping through the \u0026ldquo;database\u0026rdquo;. This is where it gets a little tricky. We\u0026rsquo;re working with a couple of nested arrays so to work our way down to the appropriate section we use \u003ccode\u003edb.Db[0].Data.Posts[0].Mobiledoc\u003c/code\u003e. This will give use the escaped version of our JSON object.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;{\\\u0026#34;version\\\u0026#34;:\\\u0026#34;0.3.1\\\u0026#34;,\\\u0026#34;markups\\\u0026#34;:[],\\\u0026#34;atoms\\\u0026#34;:[],\\\u0026#34;cards\\\u0026#34;:[[\\\u0026#34;markdown\\\u0026#34;,{\\\u0026#34;cardName\\\u0026#34;:\\\u0026#34;card-markdown\\\u0026#34;,\\\u0026#34;markdown\\\u0026#34;:\\\u0026#34;\\\\n\u0026lt;strike\u0026gt;This is a db test\u0026lt;/strike\u0026gt;.\\\\n\\\u0026#34;}]],\\\u0026#34;sections\\\u0026#34;:[[10,0]],\\\u0026#34;ghostVersion\\\u0026#34;:\\\u0026#34;3.0\\\u0026#34;}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"lets-go-on-a-trip\"\u003eLet\u0026rsquo;s Go On A Trip\u003c/h3\u003e\n\u003cp\u003eI knew that there would be a way to unescape the string that we get, checking the \u003ca href=\"https://pkg.go.dev/strconv?utm_source=gopls#Unquote\"\u003eGo documentation\u003c/a\u003e led me to \u003ccode\u003estrconv.Unquote\u003c/code\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eUnquote interprets s as a single-quoted, double-quoted, or backquoted Go string literal, returning the string value that s quotes. (If s is single-quoted, it would be a Go character literal; Unquote returns the corresponding one-character string.)\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eExactly what we need! Except that when I tried to unquote the string I kept receiving an  \u003ccode\u003einvalid syntax\u003c/code\u003e error. This had me confused for a little bit. After puzzling over it I realized if I prepended and appended a back tick to the string it seems to be treated as a raw string literal. This leads to code that looks like the following.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tc \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;`\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e db.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Mobiledoc \u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;`\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tun, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e strconv.\u003cspan style=\"color:#268bd2\"\u003eUnquote\u003c/span\u003e(c)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;%v\\n\u0026#34;\u003c/span\u003e, un)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFinally! We have the JSON!\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;version\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;0.3.1\u0026#34;\u003c/span\u003e,\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;markups\u0026#34;\u003c/span\u003e:[],\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;atoms\u0026#34;\u003c/span\u003e:[],\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;cards\u0026#34;\u003c/span\u003e:[[\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;markdown\u0026#34;\u003c/span\u003e,{\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;cardName\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;card-markdown\u0026#34;\u003c/span\u003e,\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;markdown\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\\n\u0026lt;strike\u0026gt;This is a db test\u0026lt;/strike\u0026gt;.\\n\u0026#34;\u003c/span\u003e}]],\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;sections\u0026#34;\u003c/span\u003e:[[\u003cspan style=\"color:#2aa198\"\u003e10\u003c/span\u003e,\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e]],\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;ghostVersion\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;3.0\u0026#34;\u003c/span\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNow, we can unmarshal that into the Mobiledoc struct we set up earlier!\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e md Mobiledoc\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\terr = json.\u003cspan style=\"color:#268bd2\"\u003eUnmarshal\u003c/span\u003e([]\u003cspan style=\"color:#b58900\"\u003ebyte\u003c/span\u003e(un), \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003emd)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;%#v\u0026#34;\u003c/span\u003e, md)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eChecking our dumped result we can see that we\u0026rsquo;ve got the expected data.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emain.Mobiledoc{Version:\u0026#34;0.3.1\u0026#34;, Markups:[]interface {}{}, Atoms:[]interface {}{}, Cards:[][]interface {}{[]interface {}{\u0026#34;markdown\u0026#34;, map[string]interface {}{\u0026#34;cardName\u0026#34;:\u0026#34;card-markdown\u0026#34;, \u0026#34;markdown\u0026#34;:\u0026#34;\\n\u0026lt;strike\u0026gt;This is a db test\u0026lt;/strike\u0026gt;.\\n\u0026#34;}}}, Sections:[][]int{[]int{10, 0}}, GhostVersion:\u0026#34;3.0\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eRight now we\u0026rsquo;re concerned with the section called \u003ccode\u003eCards\u003c/code\u003e which if we naively want to access we can use the following.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tcard \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e md.Cards[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e][\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\\n\\ncard: %#v\\n\u0026#34;\u003c/span\u003e, card)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecard: map[string]interface {}{\u0026#34;cardName\u0026#34;:\u0026#34;card-markdown\u0026#34;, \u0026#34;markdown\u0026#34;:\u0026#34;\\n\u0026lt;strike\u0026gt;This is a db test\u0026lt;/strike\u0026gt;.\\n\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLet\u0026rsquo;s convert that to something a bit easier to access.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tbbb \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e card.(\u003cspan style=\"color:#268bd2\"\u003emap\u003c/span\u003e[\u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e]\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{})\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(bbb[\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;markdown\u0026#34;\u003c/span\u003e])\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-markdown\" data-lang=\"markdown\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#268bd2\"\u003estrike\u003c/span\u003e\u0026gt;This is a db test\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003estrike\u003c/span\u003e\u0026gt;.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"next-time\"\u003eNext Time\u003c/h3\u003e\n\u003cp\u003eSo far so good, we\u0026rsquo;ve extracted the Markdown from the first post as expected. Next time around we\u0026rsquo;ll be writing a small loop to start trying to extract all the posts. I have a feeling that\u0026rsquo;s where the fun will begin.\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch3 id=\"code-listing\"\u003eCode Listing\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003epackage\u003c/span\u003e main\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003eimport\u003c/span\u003e (\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;encoding/json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;fmt\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;io\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;os\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;strconv\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;time\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003etype\u003c/span\u003e GhostDatabase \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tDb []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tMeta \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tExportedOn \u003cspan style=\"color:#dc322f\"\u003eint64\u003c/span\u003e  \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;exported_on\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tVersion    \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;version\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;meta\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tData \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tPosts []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID                   \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUUID                 \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;uuid\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTitle                \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tSlug                 \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;slug\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tMobiledoc            \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;mobiledoc\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tHTML                 \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;html\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCommentID            \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;comment_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tPlaintext            \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;plaintext\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tFeatureImage         \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;feature_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tFeatured             \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e         \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;featured\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tType                 \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;type\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tStatus               \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;status\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tLocale               \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;locale\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tVisibility           \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;visibility\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tEmailRecipientFilter \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;email_recipient_filter\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tAuthorID             \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;author_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCreatedAt            time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;created_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUpdatedAt            time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;updated_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tPublishedAt          time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;published_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCustomExcerpt        \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;custom_excerpt\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCodeinjectionHead    \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;codeinjection_head\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCodeinjectionFoot    \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;codeinjection_foot\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCustomTemplate       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;custom_template\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCanonicalURL         \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;canonical_url\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;posts\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tPostsAuthors []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID        \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tPostID    \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;post_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tAuthorID  \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;author_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tSortOrder \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;sort_order\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;posts_authors\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tPostsMeta []\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;posts_meta\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tPostsTags []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID        \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tPostID    \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;post_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTagID     \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;tag_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tSortOrder \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;sort_order\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;posts_tags\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tRoles []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID          \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tName        \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;name\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tDescription \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCreatedAt   time.Time \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;created_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUpdatedAt   time.Time \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;updated_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;roles\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tRolesUsers []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID     \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tRoleID \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;role_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUserID \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;user_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;roles_users\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tSettings []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID        \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tGroup     \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;group\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tKey       \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;key\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tValue     \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;value\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tType      \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;type\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tFlags     \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;flags\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCreatedAt time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;created_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUpdatedAt time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;updated_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;settings\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tTags []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID                 \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tName               \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;name\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tSlug               \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;slug\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tDescription        \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tFeatureImage       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;feature_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tParentID           \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;parent_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tVisibility         \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;visibility\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tOgImage            \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;og_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tOgTitle            \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;og_title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tOgDescription      \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;og_description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTwitterImage       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;twitter_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTwitterTitle       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;twitter_title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTwitterDescription \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;twitter_description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tMetaTitle          \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;meta_title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tMetaDescription    \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;meta_description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCodeinjectionHead  \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;codeinjection_head\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCodeinjectionFoot  \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;codeinjection_foot\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCanonicalURL       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;canonical_url\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tAccentColor        \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;accent_color\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCreatedAt          time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;created_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUpdatedAt          time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;updated_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;tags\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tUsers []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID              \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tName            \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;name\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tSlug            \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;slug\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tPassword        \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;password\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tEmail           \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;email\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tProfileImage    \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;profile_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCoverImage      \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;cover_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tBio             \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;bio\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tWebsite         \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;website\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tLocation        \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;location\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tFacebook        \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;facebook\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTwitter         \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;twitter\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tAccessibility   \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;accessibility\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tStatus          \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;status\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tLocale          \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;locale\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tVisibility      \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;visibility\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tMetaTitle       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;meta_title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tMetaDescription \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;meta_description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTour            \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;tour\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tLastSeen        time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;last_seen\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCreatedAt       time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;created_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUpdatedAt       time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;updated_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;users\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;data\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;db\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003etype\u003c/span\u003e Mobiledoc \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tVersion      \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e          \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;version\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tMarkups      []\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{}   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;markups\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tAtoms        []\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{}   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;atoms\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tCards        [][]\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;cards\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tSections     [][]\u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e         \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;sections\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tGhostVersion \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e          \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;ghostVersion\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003emain\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;ghost2hugo\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfile, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e os.\u003cspan style=\"color:#268bd2\"\u003eOpen\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;shindakun-dot-net.ghost.2022-03-18-22-02-58.json\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003edefer\u003c/span\u003e file.\u003cspan style=\"color:#268bd2\"\u003eClose\u003c/span\u003e()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tb, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e io.\u003cspan style=\"color:#268bd2\"\u003eReadAll\u003c/span\u003e(file)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e db GhostDatabase\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\terr = json.\u003cspan style=\"color:#268bd2\"\u003eUnmarshal\u003c/span\u003e(b, \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003edb)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tc \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;`\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e db.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Mobiledoc \u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;`\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tun, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e strconv.\u003cspan style=\"color:#268bd2\"\u003eUnquote\u003c/span\u003e(c)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;%v\u0026#34;\u003c/span\u003e, un)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e md Mobiledoc\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\terr = json.\u003cspan style=\"color:#268bd2\"\u003eUnmarshal\u003c/span\u003e([]\u003cspan style=\"color:#b58900\"\u003ebyte\u003c/span\u003e(un), \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003emd)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;%#v\u0026#34;\u003c/span\u003e, md)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tcard \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e md.Cards[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e][\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\\n\\ncard: %#v\\n\u0026#34;\u003c/span\u003e, card)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tbbb \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e card.(\u003cspan style=\"color:#268bd2\"\u003emap\u003c/span\u003e[\u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e]\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{})\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(bbb[\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;markdown\u0026#34;\u003c/span\u003e])\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
    },
    {
      "title": "Attempting to Learn Go - Ghost to Hugo 1",
      "date_published": "2022-09-18T20:54:29-07:00",
      "date_modified": "2022-09-18T20:54:29-07:00",
      "id": "https://shindakun.dev/posts/attempting-to-learn-go-ghost-to-hugo-1/",
      "url": "https://shindakun.dev/posts/attempting-to-learn-go-ghost-to-hugo-1/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003ch2 id=\"intro\"\u003eIntro\u003c/h2\u003e\n\u003cp\u003eYou probably don\u0026rsquo;t know this but \u003ca href=\"https://shindakun.net/\"\u003eshindakun.net\u003c/a\u003e has been effectively offline now for months. Currently, visiting it will only show a white page and a pop-up, no content is accessible. This is a side effect to my upgrading to a new server and moving away from Ghost as my platform of choice.\u003c/p\u003e\n\u003cp\u003eI love(d) Ghost but it just got too large to effectively run multiple sites on a small instance on Digital Ocean. I want to get the site back up and running but this time using \u003ca href=\"https://gohugo.io/\"\u003eHugo\u003c/a\u003e. This seems like a great opportunity to make a new series of ATLG posts\u0026hellip; plus it\u0026rsquo;s been a while since I\u0026rsquo;ve written any Go.\u003c/p\u003e\n\u003ch3 id=\"post-data\"\u003ePost Data\u003c/h3\u003e\n\u003cp\u003eBefore shutting down the original server I exported a copy of the Ghost database as JSON. I should be able to use this to build out the needed Markdown files to make up the content of the site. Here\u0026rsquo;s the first post.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;id\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;60710b90705967038fe662d6\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;uuid\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;71ba3d71-ac18-4f33-82f7-1962baa83a07\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;db test\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;slug\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;db-test\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;mobiledoc\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;{\\\u0026#34;version\\\u0026#34;:\\\u0026#34;0.3.1\\\u0026#34;,\\\u0026#34;markups\\\u0026#34;:[],\\\u0026#34;atoms\\\u0026#34;:[],\\\u0026#34;cards\\\u0026#34;:[[\\\u0026#34;markdown\\\u0026#34;,{\\\u0026#34;cardName\\\u0026#34;:\\\u0026#34;card-markdown\\\u0026#34;,\\\u0026#34;markdown\\\u0026#34;:\\\u0026#34;\\\\n\u0026lt;strike\u0026gt;This is a db test\u0026lt;/strike\u0026gt;.\\\\n\\\u0026#34;}]],\\\u0026#34;sections\\\u0026#34;:[[10,0]],\\\u0026#34;ghostVersion\\\u0026#34;:\\\u0026#34;3.0\\\u0026#34;}\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;html\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\u0026lt;!--kg-card-begin: markdown--\u0026gt;\u0026lt;p\u0026gt;\u0026lt;strike\u0026gt;This is a db test\u0026lt;/strike\u0026gt;.\u0026lt;/p\u0026gt;\\n\u0026lt;!--kg-card-end: markdown--\u0026gt;\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;comment_id\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;2\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;plaintext\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;This is a db test.\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;feature_image\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#cb4b16\"\u003enull\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;featured\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;post\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;status\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;published\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;locale\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#cb4b16\"\u003enull\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;visibility\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;public\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;email_recipient_filter\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;none\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;author_id\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;60710b8d705967038fe66214\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;created_at\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;2004-08-09T19:11:20.000Z\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;updated_at\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;2004-08-09T19:11:20.000Z\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;published_at\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;2004-08-09T19:11:20.000Z\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;custom_excerpt\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#cb4b16\"\u003enull\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;codeinjection_head\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#cb4b16\"\u003enull\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;codeinjection_foot\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#cb4b16\"\u003enull\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;custom_template\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#cb4b16\"\u003enull\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;canonical_url\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#cb4b16\"\u003enull\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e},\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eYes, I have some posts dating back to 2004! Back then I wrote my own custom blog software in PHP. It was a neat time, too bad none of the code survived. It almost makes me want to try and do it again only in Go\u0026hellip; but I\u0026rsquo;ll resist that urge.\u003c/p\u003e\n\u003ch3 id=\"quick-and-dirty\"\u003eQuick and Dirty\u003c/h3\u003e\n\u003cp\u003eAlright let\u0026rsquo;s write a program which will read our JSON and spit out a single post. First things first we need a struct that maps to our \u0026ldquo;database\u0026rdquo;. We get this by simply slapping the JSON into the awesome \u003ca href=\"https://mholt.github.io/json-to-go/\"\u003eJSON to Go converter\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003etype\u003c/span\u003e GhostDatabase \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tDb []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tMeta \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tExportedOn \u003cspan style=\"color:#dc322f\"\u003eint64\u003c/span\u003e  \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;exported_on\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tVersion    \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;version\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;meta\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tData \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tPosts []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID                   \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUUID                 \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;uuid\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTitle                \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tSlug                 \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;slug\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tMobiledoc            \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;mobiledoc\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tHTML                 \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;html\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCommentID            \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;comment_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tPlaintext            \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;plaintext\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tFeatureImage         \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;feature_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tFeatured             \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e         \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;featured\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tType                 \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;type\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tStatus               \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;status\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tLocale               \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;locale\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tVisibility           \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;visibility\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tEmailRecipientFilter \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;email_recipient_filter\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tAuthorID             \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;author_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCreatedAt            time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;created_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUpdatedAt            time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;updated_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tPublishedAt          time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;published_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCustomExcerpt        \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;custom_excerpt\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCodeinjectionHead    \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;codeinjection_head\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCodeinjectionFoot    \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;codeinjection_foot\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCustomTemplate       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;custom_template\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCanonicalURL         \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;canonical_url\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;posts\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tPostsAuthors []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID        \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tPostID    \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;post_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tAuthorID  \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;author_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tSortOrder \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;sort_order\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;posts_authors\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tPostsMeta []\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;posts_meta\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tPostsTags []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID        \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tPostID    \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;post_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTagID     \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;tag_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tSortOrder \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;sort_order\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;posts_tags\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tRoles []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID          \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tName        \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;name\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tDescription \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCreatedAt   time.Time \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;created_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUpdatedAt   time.Time \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;updated_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;roles\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tRolesUsers []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID     \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tRoleID \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;role_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUserID \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;user_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;roles_users\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tSettings []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID        \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tGroup     \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;group\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tKey       \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;key\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tValue     \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;value\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tType      \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;type\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tFlags     \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;flags\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCreatedAt time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;created_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUpdatedAt time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;updated_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;settings\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tTags []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID                 \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tName               \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;name\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tSlug               \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;slug\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tDescription        \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tFeatureImage       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;feature_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tParentID           \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;parent_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tVisibility         \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;visibility\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tOgImage            \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;og_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tOgTitle            \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;og_title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tOgDescription      \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;og_description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTwitterImage       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;twitter_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTwitterTitle       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;twitter_title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTwitterDescription \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;twitter_description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tMetaTitle          \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;meta_title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tMetaDescription    \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;meta_description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCodeinjectionHead  \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;codeinjection_head\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCodeinjectionFoot  \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;codeinjection_foot\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCanonicalURL       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;canonical_url\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tAccentColor        \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;accent_color\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCreatedAt          time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;created_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUpdatedAt          time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;updated_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;tags\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tUsers []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID              \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tName            \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;name\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tSlug            \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;slug\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tPassword        \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;password\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tEmail           \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;email\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tProfileImage    \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;profile_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCoverImage      \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;cover_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tBio             \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;bio\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tWebsite         \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;website\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tLocation        \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;location\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tFacebook        \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;facebook\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTwitter         \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;twitter\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tAccessibility   \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;accessibility\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tStatus          \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;status\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tLocale          \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;locale\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tVisibility      \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;visibility\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tMetaTitle       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;meta_title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tMetaDescription \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;meta_description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTour            \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;tour\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tLastSeen        time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;last_seen\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCreatedAt       time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;created_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUpdatedAt       time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;updated_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;users\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;data\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;db\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePerfect. Note that not all of the struct is strictly required but I\u0026rsquo;ll leave it in for now. Who knows I might write something to pull the tags for posts too.\u003c/p\u003e\n\u003ch3 id=\"reading-the-file\"\u003eReading the File\u003c/h3\u003e\n\u003cp\u003eTo start with we\u0026rsquo;re going to open our file. Note that this is indeed a quick and dirty version, maybe we\u0026rsquo;ll add some proper error handling later.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfile, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e os.\u003cspan style=\"color:#268bd2\"\u003eOpen\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;shindakun-dot-net.ghost.2022-03-18-22-02-58.json\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOnce opened we need to read the file into memory as a \u003ccode\u003e[]byte\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tb, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e io.\u003cspan style=\"color:#268bd2\"\u003eReadAll\u003c/span\u003e(file)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNow we\u0026rsquo;ll declare our database variable, \u003ccode\u003edb\u003c/code\u003e. Using \u003ccode\u003ejson.Unmarshal()\u003c/code\u003e we convert the JSON into the struct we will be using.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e db GhostDatabase\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\terr = json.\u003cspan style=\"color:#268bd2\"\u003eUnmarshal\u003c/span\u003e(b, \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003edb)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFinally, we print out the text of the first post.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;%#v\u0026#34;\u003c/span\u003e, db.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].HTML)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis leaves us with the output\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u0026lt;!--kg-card-begin: markdown--\u0026gt;\u003c/span\u003e\u0026lt;\u003cspan style=\"color:#268bd2\"\u003ep\u003c/span\u003e\u0026gt;\u0026lt;\u003cspan style=\"color:#268bd2\"\u003estrike\u003c/span\u003e\u0026gt;This is a db test\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003estrike\u003c/span\u003e\u0026gt;.\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ep\u003c/span\u003e\u0026gt;\\n\u003cspan style=\"color:#586e75\"\u003e\u0026lt;!--kg-card-end: markdown--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"next-time\"\u003eNext Time\u003c/h3\u003e\n\u003cp\u003eThis part of our program is relatively easy. We don\u0026rsquo;t want the HTML though, what I\u0026rsquo;d rather do is pull the Markdown out of the \u003ccode\u003emobiledoc\u003c/code\u003e value.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;mobiledoc\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;{\\\u0026#34;version\\\u0026#34;:\\\u0026#34;0.3.1\\\u0026#34;,\\\u0026#34;markups\\\u0026#34;:[],\\\u0026#34;atoms\\\u0026#34;:[],\\\u0026#34;cards\\\u0026#34;:[[\\\u0026#34;markdown\\\u0026#34;,{\\\u0026#34;cardName\\\u0026#34;:\\\u0026#34;card-markdown\\\u0026#34;,\\\u0026#34;markdown\\\u0026#34;:\\\u0026#34;\\\\n\u0026lt;strike\u0026gt;This is a db test\u0026lt;/strike\u0026gt;.\\\\n\\\u0026#34;}]],\\\u0026#34;sections\\\u0026#34;:[[10,0]],\\\u0026#34;ghostVersion\\\u0026#34;:\\\u0026#34;3.0\\\u0026#34;}\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWhich, as luck would have it, is just an embedded JSON object. It looks like we\u0026rsquo;ll need to do some cleaning up of the object removing escaped quotes. Once cleaned up it should look similar to\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;version\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;0.3.1\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;markups\u0026#34;\u003c/span\u003e: [],\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;atoms\u0026#34;\u003c/span\u003e: [],\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;cards\u0026#34;\u003c/span\u003e: [\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        [\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;markdown\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;cardName\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;card-markdown\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;markdown\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\\n\u0026lt;strike\u0026gt;This is a db test\u0026lt;/strike\u0026gt;.\\n\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        ]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    ],\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;sections\u0026#34;\u003c/span\u003e: [\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        [\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#2aa198\"\u003e10\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        ]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    ],\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;ghostVersion\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;3.0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eI haven\u0026rsquo;t looked to closely at the database but I\u0026rsquo;m hoping when I wrote my posts in Ghost they all were in a single \u003ccode\u003ecard-markdown\u003c/code\u003e. Oh well, we\u0026rsquo;ll cross that bridge eventually.\u003c/p\u003e\n\u003cp\u003eUntil next time!\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch3 id=\"code-listing\"\u003eCode Listing\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003epackage\u003c/span\u003e main\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003eimport\u003c/span\u003e (\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;encoding/json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;fmt\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;io\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;os\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;time\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003etype\u003c/span\u003e GhostDatabase \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tDb []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tMeta \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tExportedOn \u003cspan style=\"color:#dc322f\"\u003eint64\u003c/span\u003e  \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;exported_on\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tVersion    \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;version\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;meta\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tData \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tPosts []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID                   \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUUID                 \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;uuid\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTitle                \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tSlug                 \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;slug\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tMobiledoc            \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;mobiledoc\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tHTML                 \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;html\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCommentID            \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;comment_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tPlaintext            \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;plaintext\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tFeatureImage         \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;feature_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tFeatured             \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e         \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;featured\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tType                 \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;type\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tStatus               \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;status\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tLocale               \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;locale\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tVisibility           \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;visibility\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tEmailRecipientFilter \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;email_recipient_filter\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tAuthorID             \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;author_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCreatedAt            time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;created_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUpdatedAt            time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;updated_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tPublishedAt          time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;published_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCustomExcerpt        \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;custom_excerpt\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCodeinjectionHead    \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;codeinjection_head\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCodeinjectionFoot    \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;codeinjection_foot\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCustomTemplate       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;custom_template\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCanonicalURL         \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;canonical_url\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;posts\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tPostsAuthors []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID        \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tPostID    \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;post_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tAuthorID  \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;author_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tSortOrder \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;sort_order\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;posts_authors\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tPostsMeta []\u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;posts_meta\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tPostsTags []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID        \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tPostID    \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;post_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTagID     \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;tag_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tSortOrder \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;sort_order\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;posts_tags\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tRoles []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID          \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tName        \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;name\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tDescription \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCreatedAt   time.Time \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;created_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUpdatedAt   time.Time \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;updated_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;roles\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tRolesUsers []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID     \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tRoleID \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;role_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUserID \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;user_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;roles_users\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tSettings []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID        \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tGroup     \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;group\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tKey       \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;key\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tValue     \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;value\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tType      \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;type\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tFlags     \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;flags\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCreatedAt time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;created_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUpdatedAt time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;updated_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;settings\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tTags []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID                 \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tName               \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;name\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tSlug               \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;slug\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tDescription        \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tFeatureImage       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;feature_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tParentID           \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;parent_id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tVisibility         \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;visibility\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tOgImage            \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;og_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tOgTitle            \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;og_title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tOgDescription      \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;og_description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTwitterImage       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;twitter_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTwitterTitle       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;twitter_title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTwitterDescription \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;twitter_description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tMetaTitle          \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;meta_title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tMetaDescription    \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;meta_description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCodeinjectionHead  \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;codeinjection_head\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCodeinjectionFoot  \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;codeinjection_foot\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCanonicalURL       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;canonical_url\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tAccentColor        \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;accent_color\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCreatedAt          time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;created_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUpdatedAt          time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;updated_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;tags\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tUsers []\u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tID              \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;id\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tName            \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;name\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tSlug            \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;slug\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tPassword        \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;password\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tEmail           \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;email\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tProfileImage    \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;profile_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCoverImage      \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;cover_image\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tBio             \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;bio\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tWebsite         \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;website\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tLocation        \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;location\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tFacebook        \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;facebook\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTwitter         \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;twitter\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tAccessibility   \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;accessibility\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tStatus          \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;status\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tLocale          \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;locale\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tVisibility      \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e      \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;visibility\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tMetaTitle       \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;meta_title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tMetaDescription \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;meta_description\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tTour            \u003cspan style=\"color:#268bd2\"\u003einterface\u003c/span\u003e{} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;tour\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tLastSeen        time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;last_seen\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tCreatedAt       time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;created_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tUpdatedAt       time.Time   \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;updated_at\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;users\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;data\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t} \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;db\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003emain\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;ghost2hugo\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfile, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e os.\u003cspan style=\"color:#268bd2\"\u003eOpen\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;shindakun-dot-net.ghost.2022-03-18-22-02-58.json\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tb, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e io.\u003cspan style=\"color:#268bd2\"\u003eReadAll\u003c/span\u003e(file)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e db GhostDatabase\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\terr = json.\u003cspan style=\"color:#268bd2\"\u003eUnmarshal\u003c/span\u003e(b, \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003edb)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfmt.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;%#v\u0026#34;\u003c/span\u003e, db.Db[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].Data.Posts[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].HTML)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
    },
    {
      "title": "WIP Hugo Theme",
      "date_published": "2022-09-15T20:06:00-07:00",
      "date_modified": "2022-09-15T20:06:00-07:00",
      "id": "https://shindakun.dev/posts/wip-hugo-theme/",
      "url": "https://shindakun.dev/posts/wip-hugo-theme/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003ch2 id=\"intro\"\u003eIntro\u003c/h2\u003e\n\u003cp\u003eI\u0026rsquo;ve been putting in some time \u003ca href=\"https://indiewebify.me/\"\u003e\u0026ldquo;Indiewebifying\u0026rdquo;\u003c/a\u003e my Hugo theme, which started as a fork of the \u003ca href=\"https://themes.gohugo.io/themes/solar-theme-hugo/\"\u003eSolar theme\u003c/a\u003e by Bake. It\u0026rsquo;s slowly becoming more and more of my own. I\u0026rsquo;m not much of a front end developer so I\u0026rsquo;ve keep most of the basic CSS, removing only small bits and adding things where needed to fit my needs. This little post is just to remind me of what I\u0026rsquo;ve been doing, if you would like to know more just ask.\u003c/p\u003e\n\u003ch3 id=\"an-indieweb-post\"\u003eAn IndieWeb Post\u003c/h3\u003e\n\u003cp\u003eThe first portion of getting the theme updated for the IndieWeb involved adding to the HTML markup to include \u003ca href=\"http://microformats.org/wiki/h-entry\"\u003e\u003ccode\u003eh-entry\u003c/code\u003e\u003c/a\u003e. This adds a nice structure to the posts that is machine readable. This is really just adding specific classes to your HTML elements. So your post template might look something like the following:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#268bd2\"\u003earticle\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;post h-entry\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u0026lt;\u003cspan style=\"color:#268bd2\"\u003eh1\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;post-title p-name\u0026#34;\u003c/span\u003e itemprop\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;name headline\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ea\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;u-url\u0026#34;\u003c/span\u003e href\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;{{ .Permalink }}\u0026#34;\u003c/span\u003e\u0026gt;{{ .Title }}\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ea\u003c/span\u003e\u0026gt; {{ if .Draft\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }}(Draft){{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u0026lt;/\u003cspan style=\"color:#268bd2\"\u003eh1\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  {{ if .Params.cover_image }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;image\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#268bd2\"\u003eimg\u003c/span\u003e src\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;{{ .Params.cover_image }}\u0026#34;\u003c/span\u003e /\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  {{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;post-content e-content\u0026#34;\u003c/span\u003e itemprop\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;articleBody\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ .Content | safeHTML }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ep\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;meta\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Posted on\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#268bd2\"\u003espan\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;postdate\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u0026gt;\u0026lt;\u003cspan style=\"color:#268bd2\"\u003etime\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;dt-published\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u0026gt;{{ .Site.Params.DateForm | default \u0026#34;Jan 2, 2006\u0026#34; | .Date.Format\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }}\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003etime\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u0026gt;\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003espan\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ if .Params.author }} {{ with index .Site.Data.authors .Params.author }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    by\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#268bd2\"\u003espan\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;p-author h-card\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u0026gt;\u0026lt;\u003cspan style=\"color:#268bd2\"\u003ea\u003c/span\u003e href\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;{{ .link }}\u0026#34;\u003c/span\u003e\u0026gt;{{ .name }}\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ea\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u0026lt;\u003cspan style=\"color:#268bd2\"\u003eimg\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;u-photo avatar\u0026#34;\u003c/span\u003e style\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;display: none;\u0026#34;\u003c/span\u003e src\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;{{ .photo }}\u0026#34;\u003c/span\u003e /\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;/\u003cspan style=\"color:#268bd2\"\u003espan\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ end }} {{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ep\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003earticle\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAlright maybe it\u0026rsquo;s not adding too much to the page. If I were to add full \u003ca href=\"https://schema.org\"\u003eSchema.org\u003c/a\u003e JSON-LD as well we\u0026rsquo;d worry more about the page size.\u003c/p\u003e\n\u003ch3 id=\"syndication\"\u003eSyndication\u003c/h3\u003e\n\u003cp\u003eOne other aspect of the IndieWeb is the idea that you are posting your content in multiple locations. This syndication is include in the post with a relatively straight forward partial.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ if isset $.Params \u0026#34;syndication\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ $synLen := len $.Params.syndication }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ if gt $synLen 0 }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ep\u003c/span\u003e\u0026gt;Syndicated to:\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ep\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;syndication\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {{ range $k, $v := $.Params.syndication }}\u0026lt;\u003cspan style=\"color:#268bd2\"\u003ea\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;post__syn btn u-syndication syn-link\u0026#34;\u003c/span\u003e rel\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;syndication\u0026#34;\u003c/span\u003e href\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;{{ . }}\u0026#34;\u003c/span\u003e\u0026gt;{{ . }}\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ea\u003c/span\u003e\u0026gt;\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ebr\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis will loop through any syndicated links found in the posts frontmatter and write the link to the page under the current post.\u003c/p\u003e\n\u003ch3 id=\"webmentions\"\u003eWebmentions\u003c/h3\u003e\n\u003cp\u003eI\u0026rsquo;ve already written a bit about \u003ca href=\"https://shindakun.dev/posts/adding-webmentions-to-microblog/\"\u003eadding webmentions to sites\u003c/a\u003e and this advice works for Hugo. I didn\u0026rsquo;t happen to note who wrote the JavaScript that takes care of fetching mentions sadly. I did track down a similar script in a \u003ca href=\"https://gist.github.com/Nooshu/121e5bf7f3d5c6528413c57db257894f\"\u003egist\u003c/a\u003e from Nooshu so maybe that\u0026rsquo;s that.\u003c/p\u003e\n\u003ch3 id=\"post-types\"\u003ePost Types\u003c/h3\u003e\n\u003cp\u003eOne of the departures from Solar is that I\u0026rsquo;m working on having different post types, either microblog style notes or full on blog posts. I need to break out the code a little bit though as right now the code is just rendered slightly differently depending on post type. I want to take each and move them into individual partials. I\u0026rsquo;ve just updated the code to implement a proper \u003ccode\u003eh-feed\u003c/code\u003e. An example of how the feed might look can be found on \u003ca href=\"https://monocle.p3k.io/preview?url=https%3A%2F%2Fshindakun.dev\"\u003eMonocle\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ define \u0026#34;main\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#268bd2\"\u003emain\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;h-feed\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  {{ range .Paginator.Pages }} {{ if eq .Type \u0026#34;posts\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u0026lt;\u003cspan style=\"color:#268bd2\"\u003earticle\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;post h-entry\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ if .Params.cover_image }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ea\u003c/span\u003e href\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;{{ .Permalink }}\u0026#34;\u003c/span\u003e\u0026gt;\u0026lt;\u003cspan style=\"color:#268bd2\"\u003eimg\u003c/span\u003e src\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;{{ .Params.cover_image }}\u0026#34;\u003c/span\u003e /\u0026gt;\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ea\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#268bd2\"\u003eh1\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;p-name\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ea\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;u-url\u0026#34;\u003c/span\u003e href\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;{{ .Permalink }}\u0026#34;\u003c/span\u003e\u0026gt;{{ .Title }}\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ea\u003c/span\u003e\u0026gt; {{ if .Draft\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      }}(Draft){{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;/\u003cspan style=\"color:#268bd2\"\u003eh1\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;post-content\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ep\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;e-content\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {{ .Summary | plainify | safeHTML }} {{ if .Truncated }} … {{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ep\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ep\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;meta\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      Posted on\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u0026lt;\u003cspan style=\"color:#268bd2\"\u003espan\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;postdate\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u0026gt;{{ .Site.Params.DateForm | default \u0026#34;Jan 2, 2006 \u0026#34; | .Date.Format\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }}\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003espan\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ep\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u0026lt;/\u003cspan style=\"color:#268bd2\"\u003earticle\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  {{ end }} {{ if eq .Type \u0026#34;notes\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u0026lt;\u003cspan style=\"color:#268bd2\"\u003earticle\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;note h-entry\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ if .Params.cover_image }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ea\u003c/span\u003e href\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;{{ .Permalink }}\u0026#34;\u003c/span\u003e\u0026gt;\u0026lt;\u003cspan style=\"color:#268bd2\"\u003eimg\u003c/span\u003e src\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;{{ .Params.cover_image }}\u0026#34;\u003c/span\u003e /\u0026gt;\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ea\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;note-content\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ep\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;p-content\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {{ .Summary | plainify | safeHTML }} {{ if .Truncated }} … {{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ep\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ep\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;meta\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      Posted on\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ea\u003c/span\u003e href\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;{{ .Permalink }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u0026gt;\u0026lt;\u003cspan style=\"color:#268bd2\"\u003espan\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;postdate dt-published\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e          \u0026gt;{{ .Site.Params.DateForm | default \u0026#34;Jan 2, 2006 \u0026#34; | .Date.Format\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e          }}\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003espan\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u0026gt;\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ea\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ep\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u0026lt;/\u003cspan style=\"color:#268bd2\"\u003earticle\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  {{ end }} {{ end }} {{ partial \u0026#34;pagination.html\u0026#34; . }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003emain\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eMeanwhile, the core \u003ccode\u003esingle.html\u003c/code\u003e partial is currently used for both post types, I will want to change that too so I can style the posts slightly differently.\u003c/p\u003e\n\u003ch3 id=\"css\"\u003eCSS\u003c/h3\u003e\n\u003cp\u003eAs I mentioned I have been staying away from the CSS with the exception of removing styling and setting some defaults that fit what I\u0026rsquo;d like more. I need to go through the SCSS and make sure that each of the class names follow a similar pattern as I\u0026rsquo;ve borrowed some CSS from various sources with wildly different name styles. For instance I have \u003ccode\u003epost-content\u003c/code\u003e and \u003ccode\u003epost__tags\u003c/code\u003e. I\u0026rsquo;ll probably stick with kebab-case.\u003c/p\u003e\n\u003ch3 id=\"the-future\"\u003eThe Future\u003c/h3\u003e\n\u003cp\u003eI have a bunch more work to do on the theme to tidy it up then I might release it publicly. I suppose the world could use another IndieWeb compatible theme.\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n"
    },
    {
      "title": "Adding gcc to git bash",
      "date_published": "2022-09-03T12:43:41-07:00",
      "date_modified": "2022-09-03T12:43:41-07:00",
      "id": "https://shindakun.dev/posts/adding-gcc-to-git-bash/",
      "url": "https://shindakun.dev/posts/adding-gcc-to-git-bash/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003cp\u003eSo today I was working on my \u0026ldquo;main\u0026rdquo; computer which didn\u0026rsquo;t have much set up on it. Basically only \u003ca href=\"https://git-scm.com/downloads\"\u003egit bash\u003c/a\u003e. Problem is I wanted to work on my Hugo site and theme.\u003c/p\u003e\n\u003cp\u003eTo do that I needed to install the version of Hugo with extended support for SCSS. This requires \u003ccode\u003egcc\u003c/code\u003e. The quickest solution I found was to just install \u003ca href=\"https://www.msys2.org/\"\u003e\u003ccode\u003emsys2\u003c/code\u003e\u003c/a\u003e. Once installed and added to the path it was just a matter of changing to the Hugo directory and running \u003ccode\u003ego install --tags extended\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ \u003cspan style=\"color:#b58900\"\u003ecd\u003c/span\u003e /d/Code/hugo/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ go install --tags extended\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ hugo version\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehugo v0.103.0-DEV-06c3ac67411e2faaf1545427d4df4e326fffd3c0+extended windows/amd64 \u003cspan style=\"color:#268bd2\"\u003eBuildDate\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e2022-09-03T09:38:03Z\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e"
    },
    {
      "title": "Getting Reacquainted With Hugo",
      "date_published": "2022-05-23T18:55:20-07:00",
      "date_modified": "2022-05-23T18:55:20-07:00",
      "id": "https://shindakun.dev/posts/getting-reacquainted-with-hugo/",
      "url": "https://shindakun.dev/posts/getting-reacquainted-with-hugo/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003ch2 id=\"testing-testing-testing\"\u003eTesting testing testing\u003c/h2\u003e\n\u003cp\u003eIt\u0026rsquo;s been a bit since I\u0026rsquo;ve looked at my Hugo blog here on \u003ca href=\"https://shindakun.dev\"\u003eshindakun.dev\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"hugo\"\u003eHugo\u003c/h2\u003e\n\u003cp\u003eFirst things first, I need to get all my repositories in line. When I originally set everything up I had it separated in a couple different repos. The main repo held everything needed to build the base Hugo. I had two submodules for the themes that power the site. Finally, I had a repo just for blog posts. Why I didn\u0026rsquo;t include the blog posts repo as a submodule originally is lost to time though. We\u0026rsquo;re going to add them in as a submodule much like our themes.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit submodule add https://github.com/shindakun/posts\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNow we can just run\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit clone --recursive  https://github.com/shindakun/shindakun.dev.git\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAnd we\u0026rsquo;ll get the entire site. Since the site running behind Nginx we can then just build it and server from the \u003ccode\u003epublic\u003c/code\u003e directory.\u003c/p\u003e\n\u003ch2 id=\"nginx\"\u003eNginx\u003c/h2\u003e\n\u003cp\u003eThe currently deployed version of the site is just a copy of the \u003ccode\u003epublic\u003c/code\u003e directory and the configuration looks like\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eserver {\n    server_name shindakun.dev;\n    root /var/www/shindakun.dev;\n    index index.html;\n\n    location / {\n        try_files $uri $uri/ =404;\n    }\n\n    listen [::]:443 http2 ssl; # managed by Certbot\n    listen 443 ssl http2; # managed by Certbot\n    ssl_certificate /etc/letsencrypt/live/shindakun.dev/fullchain.pem; # managed by Certbot\n    ssl_certificate_key /etc/letsencrypt/live/shindakun.dev/privkey.pem; # managed by Certbot\n    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot\n    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot\n}\n\nserver {\n    if ($host = shindakun.dev) {\n        return 301 https://$host$request_uri;\n    } # managed by Certbot\n\n    listen 80;\n    listen [::]:80;\n\n    server_name shindakun.dev;\n    return 404; # managed by Certbot\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eWe\u0026rsquo;ll update \u003ccode\u003eroot /var/www/shindakun.dev;\u003c/code\u003e to be \u003ccode\u003eroot /var/www/shindakun.dev/public;\u003c/code\u003e once everything is sorted on the server itself.\u003c/p\u003e\n\u003ch2 id=\"but-why\"\u003eBut why?\u003c/h2\u003e\n\u003cp\u003eWhy do any of this? Well, keeping a blog is something I\u0026rsquo;ve always enjoyed - though sometimes I\u0026rsquo;m not very good at it. Mostly because I link to tinker. While I don\u0026rsquo;t fully run my server I manage most aspects of the Digital Ocean droplet I use. I used to use Ghost, but it has slowly gotten to the state where I could only run a single blog on a droplet. Whereas if I use Hugo I can run countless websites with nothing but Nginx.\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n"
    },
    {
      "title": "Polywork Poster in Go",
      "date_published": "2021-05-09T17:54:00-07:00",
      "date_modified": "2021-05-09T17:54:00-07:00",
      "id": "https://shindakun.dev/posts/polywork-poster/",
      "url": "https://shindakun.dev/posts/polywork-poster/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003ch2 id=\"intro\"\u003eIntro\u003c/h2\u003e\n\u003cp\u003eA couple of days ago I finally got access to Polywork. Which, for those who don\u0026rsquo;t know, is like a new-aged Linkedin. It allows you to create a timeline of your work and accomplishments. The idea is that people will be able to contact you through the site to offer you work or opportunities.Take a look at \u003ca href=\"https://meta.shindakun.dev/\"\u003emeta.shindakun.dev\u003c/a\u003e for a simple example timeline.\u003c/p\u003e\n\u003cp\u003eOne of the things that struck me was that there is no public API at the moment. Which bummed me out as I didn\u0026rsquo;t want to start entering blog posts by hand. So, I decided to poke around a bit and see what the flow is for creating a new post. With the objected being crafting some Go code to create posts.\u003c/p\u003e\n\u003cp\u003eThis would dovetail nicely into our \u003ca href=\"https://shindakun.dev/golang-data-connector-part-1/\"\u003edata connector series\u003c/a\u003e.\u003c/p\u003e\n\u003ch3 id=\"getting-started\"\u003eGetting Started\u003c/h3\u003e\n\u003cp\u003eFirst, we need to look to see how the site lets us put up a new post. This can be done via the network tab in Chromes Dev Tools.\u003c/p\u003e\n\u003cp\u003e![[newpost.gif]]\u003c/p\u003e\n\u003cp\u003eWe can see that clicking on the \u0026ldquo;Post\u0026rdquo; button brings up a form that we can use to enter our details. Looking at the details of the \u003ccode\u003eedit\u003c/code\u003e network call shows the entire \u003ca href=\"https://turbo.hotwire.dev/handbook/frames\"\u003eTurbo Frame\u003c/a\u003e that makes up. \u003ccode\u003enew\u003c/code\u003e in this case seems to just redirect to \u003ccode\u003eedit\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e![[Pasted image 20210509185610.png]]\u003c/p\u003e\n\u003cp\u003ePerfect! This will allow us to grab the details we need from the form. We need both the update ID and the authenticity token. Though at present it seems the authenticity token isn\u0026rsquo;t actually required when posting a new update. 🤷‍♂️  I won\u0026rsquo;t show the complete posting flow via the website since it includes cookies but you get the idea.\u003c/p\u003e\n\u003cp\u003e![[Pasted image 20210509185946.png]]\u003c/p\u003e\n\u003ch3 id=\"our-plan\"\u003eOur Plan\u003c/h3\u003e\n\u003cp\u003eSo here is what we are going to do:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003emake a request to \u003ccode\u003ehttps://www.polywork.com/shindakun/highlights/new/\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003eextract the update ID and authenticity token\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003ecreate a \u003ccode\u003emultipart\u003c/code\u003e form with information we want to post\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ePOST\u003c/code\u003e to \u003ccode\u003ehttps://www.polywork.com/shindakun/highlights/{{update_id}}\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch3 id=\"getting-polywork-to-go\"\u003eGetting Polywork to Go\u003c/h3\u003e\n\u003cp\u003eAs always you can find the full code listing at the bottom of this post. Also, this code is pretty sloppy and a bit brittle since it is just a proof of concept.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003epackage\u003c/span\u003e main\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003eimport\u003c/span\u003e (\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;bytes\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;fmt\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;io\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;log\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;mime/multipart\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;net/http\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;regexp\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;strings\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;github.com/andybalholm/cascadia\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;golang.org/x/net/html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003econst\u003c/span\u003e cookie = \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;_polywork_session=...snip...\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003econst\u003c/span\u003e username = \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;shindakun\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWe start up by setting our cookie value. This is necessary to be able to \u003ccode\u003ePOST\u003c/code\u003e to the website. I simply grabbed this value from the network tab in Chrome. We could start with a \u0026ldquo;magic\u0026rdquo; link login but this seemed easier. We\u0026rsquo;ll also set our username.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003emain\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\treq, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e http.\u003cspan style=\"color:#268bd2\"\u003eNewRequest\u003c/span\u003e(http.MethodGet, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;https://www.polywork.com/\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003eusername\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;/highlights/new/\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\treq.Header.\u003cspan style=\"color:#268bd2\"\u003eAdd\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;Cookie\u0026#34;\u003c/span\u003e, cookie)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\treq.Header.\u003cspan style=\"color:#268bd2\"\u003eAdd\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;Turbo-Frame\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;navbar-post-highlight\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tlog.\u003cspan style=\"color:#268bd2\"\u003eFatal\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tres, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e http.DefaultClient.\u003cspan style=\"color:#268bd2\"\u003eDo\u003c/span\u003e(req)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tlog.\u003cspan style=\"color:#268bd2\"\u003eFatal\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003edefer\u003c/span\u003e res.Body.\u003cspan style=\"color:#268bd2\"\u003eClose\u003c/span\u003e()\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIf you\u0026rsquo;ve worked with Go before this probably looks very familiar. What we are doing is using \u003ccode\u003ehttp.NewRequest\u003c/code\u003e to request to \u003ccode\u003e/{{username}}/highlights/new\u003c/code\u003e. Note how we are setting the cookie directly in the header and setting a header for the \u003ccode\u003eTurbo-Frame\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eCalling \u003ccode\u003ehttp.DefaultClient.Do(req)\u003c/code\u003e makes the request to the remote server and if successful will return that data in \u003ccode\u003eres\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tdoc, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e html.\u003cspan style=\"color:#268bd2\"\u003eParse\u003c/span\u003e(res.Body)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tlog.\u003cspan style=\"color:#268bd2\"\u003eFatal\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#586e75\"\u003e// inputs := cascadia.MustCompile(\u0026#34;input\u0026#34;).MatchAll(doc)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tbuttons \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e cascadia.\u003cspan style=\"color:#268bd2\"\u003eMustCompile\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;button\u0026#34;\u003c/span\u003e).\u003cspan style=\"color:#268bd2\"\u003eMatchAll\u003c/span\u003e(doc)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tre \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e regexp.\u003cspan style=\"color:#268bd2\"\u003eMustCompile\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e`\\/shindakun\\/highlights\\/(.*)\\/save_draft`\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tr \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e re.\u003cspan style=\"color:#268bd2\"\u003eFindStringSubmatch\u003c/span\u003e(buttons[\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e].Attr[\u003cspan style=\"color:#2aa198\"\u003e5\u003c/span\u003e].Val)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eHere we\u0026rsquo;re going to get a bit tricky. The first thing we want to do is use the parse our incoming form as HTML. This then allows us to use the  \u003ca href=\"https://github.com/andybalholm/cascadia\"\u003e\u003ccode\u003ecascadia\u003c/code\u003e library\u003c/a\u003e and CSS selectors to grab all the buttons. We don\u0026rsquo;t really need all of them but for this first version what the heck.\u003c/p\u003e\n\u003cp\u003eUsing the regular expression \u003ccode\u003e\\/shindakun\\/highlights\\/(.*)\\/save_draft\u003c/code\u003e we extract the ID for the post we are working with.\u003c/p\u003e\n\u003cp\u003eThis is the main section of the code that is very brittle since I\u0026rsquo;m not doing anything to validate we are looking at the right button key and instead just hard coding the values that I saw during testing.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#586e75\"\u003e// _method: patch\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\t\u003cspan style=\"color:#586e75\"\u003e// authenticity_token: ...snip...\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\t\u003cspan style=\"color:#586e75\"\u003e// draft_highlight[end_date]: 01-01-2021\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\t\u003cspan style=\"color:#586e75\"\u003e// draft_highlight[content]: \u0026lt;div\u0026gt;Testing\u0026lt;/div\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\t\u003cspan style=\"color:#586e75\"\u003e// draft_highlight[activity_ids][]: 76199\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\t\u003cspan style=\"color:#586e75\"\u003e// commit: Post\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDuring testing, I made a copy of the form data \u003ccode\u003ePOST\u003c/code\u003eed from Chrome for reference. We\u0026rsquo;ll use this as our base form data. As you\u0026rsquo;ll see below not every field is required. I think I can leave out the \u003ccode\u003e_method\u003c/code\u003e field but have not tried as of yet. I mentioned before but you should also note that I\u0026rsquo;m not using the \u003ccode\u003eauthenticity_token\u003c/code\u003e token as it seems it is not required.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tbody \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003ebytes.Buffer{}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\twriter \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e multipart.\u003cspan style=\"color:#268bd2\"\u003eNewWriter\u003c/span\u003e(body)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfw, _ \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e writer.\u003cspan style=\"color:#268bd2\"\u003eCreateFormField\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;_method\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t_, err = io.\u003cspan style=\"color:#268bd2\"\u003eCopy\u003c/span\u003e(fw, strings.\u003cspan style=\"color:#268bd2\"\u003eNewReader\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;patch\u0026#34;\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tlog.\u003cspan style=\"color:#268bd2\"\u003eFatal\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#586e75\"\u003e// fw, _ = writer.CreateFormField(\u0026#34;authenticity_token\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\t\u003cspan style=\"color:#586e75\"\u003e// _, err = io.Copy(fw, strings.NewReader(inputs[1].Attr[2].Val))\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\t\u003cspan style=\"color:#586e75\"\u003e// if err != nil {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\t\u003cspan style=\"color:#586e75\"\u003e// \tlog.Fatal(err)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\t\u003cspan style=\"color:#586e75\"\u003e// }\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfw, _ = writer.\u003cspan style=\"color:#268bd2\"\u003eCreateFormField\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;draft_highlight[content]\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t_, err = io.\u003cspan style=\"color:#268bd2\"\u003eCopy\u003c/span\u003e(fw, strings.\u003cspan style=\"color:#268bd2\"\u003eNewReader\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\u0026lt;div\u0026gt;Posting via Golang\u0026lt;/div\u0026gt; :) \u0026lt;a href=\\\u0026#34;https://shindakun.dev\\\u0026#34;\u0026gt;shindakun\u0026lt;/a\u0026gt;\u0026#34;\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tlog.\u003cspan style=\"color:#268bd2\"\u003eFatal\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfw, _ = writer.\u003cspan style=\"color:#268bd2\"\u003eCreateFormField\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;commit\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t_, err = io.\u003cspan style=\"color:#268bd2\"\u003eCopy\u003c/span\u003e(fw, strings.\u003cspan style=\"color:#268bd2\"\u003eNewReader\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;Post\u0026#34;\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tlog.\u003cspan style=\"color:#268bd2\"\u003eFatal\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\twriter.\u003cspan style=\"color:#268bd2\"\u003eClose\u003c/span\u003e()\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIt\u0026rsquo;s a bit awkward to create a form in Go but hey, it works. We make a form field with \u003ccode\u003ewriter.CreateFormField\u003c/code\u003e and then \u003ccode\u003eio.Copy\u003c/code\u003e our data into that field. Right now our payload is hardcoded. We could easily adapt my data connector post to automatically add my Ghost blog posts to Polywork.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tpost, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e http.\u003cspan style=\"color:#268bd2\"\u003eNewRequest\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;POST\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;https://www.polywork.com/shindakun/highlights/\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003er[\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e], bytes.\u003cspan style=\"color:#268bd2\"\u003eNewReader\u003c/span\u003e(body.\u003cspan style=\"color:#268bd2\"\u003eBytes\u003c/span\u003e()))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tlog.\u003cspan style=\"color:#268bd2\"\u003eFatal\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tpost.Header.\u003cspan style=\"color:#268bd2\"\u003eSet\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;Content-Type\u0026#34;\u003c/span\u003e, writer.\u003cspan style=\"color:#268bd2\"\u003eFormDataContentType\u003c/span\u003e())\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tpost.Header.\u003cspan style=\"color:#268bd2\"\u003eAdd\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;Cookie\u0026#34;\u003c/span\u003e, cookie)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\trsp, _ \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e http.DefaultClient.\u003cspan style=\"color:#268bd2\"\u003eDo\u003c/span\u003e(post)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e rsp.StatusCode \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e http.StatusOK {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tlog.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;Request failed with response code: %d\u0026#34;\u003c/span\u003e, rsp.StatusCode)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAnd now we do the actual form submit. And that\u0026rsquo;s all there is too it.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"Screen%20Shot%202021-05-11%20at%2010.10.21%20AM.png\" alt=\"\"\u003e\u003c/p\u003e\n\u003ch3 id=\"whats-next\"\u003eWhat\u0026rsquo;s Next?\u003c/h3\u003e\n\u003cp\u003eNext, I think I am going to adapt this code to use with the \u003ca href=\"https://shindakun.dev/golang-data-connector-part-1/\"\u003edata connector we are working on\u003c/a\u003e. I\u0026rsquo;ll probably try to make it pretty generic so I can use it as its own module.\u003c/p\u003e\n\u003ch3 id=\"code-listing\"\u003eCode Listing\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003epackage\u003c/span\u003e main\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003eimport\u003c/span\u003e (\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;bytes\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;fmt\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;io\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;log\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;mime/multipart\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;net/http\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;regexp\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;strings\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;github.com/andybalholm/cascadia\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;golang.org/x/net/html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003econst\u003c/span\u003e cookie = \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;_polywork_session=...snip...\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003econst\u003c/span\u003e username = \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;shindakun\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003emain\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\treq, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e http.\u003cspan style=\"color:#268bd2\"\u003eNewRequest\u003c/span\u003e(http.MethodGet, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;https://www.polywork.com/\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003eusername\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;/highlights/new/\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\treq.Header.\u003cspan style=\"color:#268bd2\"\u003eAdd\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;Cookie\u0026#34;\u003c/span\u003e, cookie)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\treq.Header.\u003cspan style=\"color:#268bd2\"\u003eAdd\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;Turbo-Frame\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;navbar-post-highlight\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tlog.\u003cspan style=\"color:#268bd2\"\u003eFatal\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tres, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e http.DefaultClient.\u003cspan style=\"color:#268bd2\"\u003eDo\u003c/span\u003e(req)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tlog.\u003cspan style=\"color:#268bd2\"\u003eFatal\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003edefer\u003c/span\u003e res.Body.\u003cspan style=\"color:#268bd2\"\u003eClose\u003c/span\u003e()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tdoc, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e html.\u003cspan style=\"color:#268bd2\"\u003eParse\u003c/span\u003e(res.Body)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tlog.\u003cspan style=\"color:#268bd2\"\u003eFatal\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#586e75\"\u003e// inputs := cascadia.MustCompile(\u0026#34;input\u0026#34;).MatchAll(doc)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tbuttons \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e cascadia.\u003cspan style=\"color:#268bd2\"\u003eMustCompile\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;button\u0026#34;\u003c/span\u003e).\u003cspan style=\"color:#268bd2\"\u003eMatchAll\u003c/span\u003e(doc)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tre \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e regexp.\u003cspan style=\"color:#268bd2\"\u003eMustCompile\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e`\\/shindakun\\/highlights\\/(.*)\\/save_draft`\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tr \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e re.\u003cspan style=\"color:#268bd2\"\u003eFindStringSubmatch\u003c/span\u003e(buttons[\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e].Attr[\u003cspan style=\"color:#2aa198\"\u003e5\u003c/span\u003e].Val)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#586e75\"\u003e// _method: patch\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\t\u003cspan style=\"color:#586e75\"\u003e// authenticity_token: ...snip...\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\t\u003cspan style=\"color:#586e75\"\u003e// draft_highlight[end_date]: 01-01-2021\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\t\u003cspan style=\"color:#586e75\"\u003e// draft_highlight[content]: \u0026lt;div\u0026gt;Testing\u0026lt;/div\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\t\u003cspan style=\"color:#586e75\"\u003e// draft_highlight[activity_ids][]: 76199\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\t\u003cspan style=\"color:#586e75\"\u003e// commit: Post\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tbody \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003ebytes.Buffer{}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\twriter \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e multipart.\u003cspan style=\"color:#268bd2\"\u003eNewWriter\u003c/span\u003e(body)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfw, _ \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e writer.\u003cspan style=\"color:#268bd2\"\u003eCreateFormField\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;_method\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t_, err = io.\u003cspan style=\"color:#268bd2\"\u003eCopy\u003c/span\u003e(fw, strings.\u003cspan style=\"color:#268bd2\"\u003eNewReader\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;patch\u0026#34;\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tlog.\u003cspan style=\"color:#268bd2\"\u003eFatal\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#586e75\"\u003e// fw, _ = writer.CreateFormField(\u0026#34;authenticity_token\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\t\u003cspan style=\"color:#586e75\"\u003e// _, err = io.Copy(fw, strings.NewReader(inputs[1].Attr[2].Val))\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\t\u003cspan style=\"color:#586e75\"\u003e// if err != nil {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\t\u003cspan style=\"color:#586e75\"\u003e// \tlog.Fatal(err)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\t\u003cspan style=\"color:#586e75\"\u003e// }\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\tfw, _ = writer.\u003cspan style=\"color:#268bd2\"\u003eCreateFormField\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;draft_highlight[content]\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t_, err = io.\u003cspan style=\"color:#268bd2\"\u003eCopy\u003c/span\u003e(fw, strings.\u003cspan style=\"color:#268bd2\"\u003eNewReader\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\u0026lt;div\u0026gt;Posting via Golang\u0026lt;/div\u0026gt; :) \u0026lt;a href=\\\u0026#34;https://shindakun.dev\\\u0026#34;\u0026gt;shindakun\u0026lt;/a\u0026gt;\u0026#34;\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tlog.\u003cspan style=\"color:#268bd2\"\u003eFatal\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tfw, _ = writer.\u003cspan style=\"color:#268bd2\"\u003eCreateFormField\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;commit\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t_, err = io.\u003cspan style=\"color:#268bd2\"\u003eCopy\u003c/span\u003e(fw, strings.\u003cspan style=\"color:#268bd2\"\u003eNewReader\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;Post\u0026#34;\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tlog.\u003cspan style=\"color:#268bd2\"\u003eFatal\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\twriter.\u003cspan style=\"color:#268bd2\"\u003eClose\u003c/span\u003e()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tpost, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e http.\u003cspan style=\"color:#268bd2\"\u003eNewRequest\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;POST\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;https://www.polywork.com/shindakun/highlights/\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003er[\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e], bytes.\u003cspan style=\"color:#268bd2\"\u003eNewReader\u003c/span\u003e(body.\u003cspan style=\"color:#268bd2\"\u003eBytes\u003c/span\u003e()))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tlog.\u003cspan style=\"color:#268bd2\"\u003eFatal\u003c/span\u003e(err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tpost.Header.\u003cspan style=\"color:#268bd2\"\u003eSet\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;Content-Type\u0026#34;\u003c/span\u003e, writer.\u003cspan style=\"color:#268bd2\"\u003eFormDataContentType\u003c/span\u003e())\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tpost.Header.\u003cspan style=\"color:#268bd2\"\u003eAdd\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;Cookie\u0026#34;\u003c/span\u003e, cookie)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\trsp, _ \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e http.DefaultClient.\u003cspan style=\"color:#268bd2\"\u003eDo\u003c/span\u003e(post)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e rsp.StatusCode \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e http.StatusOK {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tlog.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;Request failed with response code: %d\u0026#34;\u003c/span\u003e, rsp.StatusCode)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
    },
    {
      "title": "2020 Roguelikedev Tutorial Week 2",
      "date_published": "2020-06-29T22:40:26-07:00",
      "date_modified": "2020-06-29T22:40:26-07:00",
      "id": "https://shindakun.dev/posts/2020-roguelikedev-tutorial-week-2/",
      "url": "https://shindakun.dev/posts/2020-roguelikedev-tutorial-week-2/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003ch1 id=\"roguelikedev-does-the-complete-roguelike-tutorial\"\u003eRoguelikeDev Does The Complete Roguelike Tutorial\u003c/h1\u003e\n\u003ch2 id=\"week-2---june-23rd---29th-2020\"\u003eWeek 2 - June 23rd - 29th 2020\u003c/h2\u003e\n\u003ch2 id=\"introduction\"\u003eIntroduction\u003c/h2\u003e\n\u003cp\u003eThat\u0026rsquo;s right - we are continuing our work on the Roguelike Tutorial! This week we\u0026rsquo;ll try to get through parts 2 and 3 (and almost make it). I did have one small update after the last post that I briefly mentioned on Twitter so, I figured I should mention it here.\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003cp\u003eAnd with that out of the way, let\u0026rsquo;s continue on!\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"part-2---the-generic-entity-the-render-functions-and-the-map\"\u003ePart 2 - The Generic Entity, the Render Functions, and the Map\u003c/h2\u003e\n\u003cp\u003ePart 2 is jammed packed! I\u0026rsquo;m not going to strictly follow everything but for the most part will keep the basic structure the same.\u003c/p\u003e\n\u003ch3 id=\"the-generic-entity\"\u003eThe Generic Entity\u003c/h3\u003e\n\u003cp\u003eI\u0026rsquo;ve decided to go with a \u0026ldquo;constructor\u0026rdquo; function that will return a new \u0026ldquo;entity\u0026rdquo; table. Note that I\u0026rsquo;m calling it \u003ccode\u003eobj\u003c/code\u003e in the code but it\u0026rsquo;s just a table of key/value pairs. Maybe \u003ccode\u003eent\u003c/code\u003e is a better as a name. 🤔\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003enew_entity\u003c/span\u003e(typ, name, sp, x, y, spd)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003elocal\u003c/span\u003e obj \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    typ\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003etyp,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    name\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003ename,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    sp\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003esp,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    x\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003ex,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    y\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003ey,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    spd\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003espd,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    move\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e(self, dx, dy)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      self.x \u003cspan style=\"color:#719e07\"\u003e+=\u003c/span\u003e dx\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      self.y \u003cspan style=\"color:#719e07\"\u003e+=\u003c/span\u003e dy\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    attack\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e(self, tx, ty)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#586e75\"\u003e--\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003ereturn\u003c/span\u003e obj\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLet\u0026rsquo;s take a closer look at the basic setup. I expect this to grow over time as I add things like damage. We may be limited on what we can squeeze in though.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003elocal\u003c/span\u003e obj \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    typ \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e typ,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    name \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e name,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    sp \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e sp,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    x \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e x,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    y \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e y,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    spd \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e spd,\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e\u003ccode\u003etyp\u003c/code\u003e is the \u0026ldquo;type\u0026rdquo; of entity. Right now I only am planing on two entity types, \u0026ldquo;pc\u0026rdquo; (player character) and \u0026ldquo;monst\u0026rdquo; (monster). This could be extended to include things like \u0026ldquo;npc\u0026rdquo;, \u0026ldquo;pet\u0026rdquo;, \u0026ldquo;animal\u0026rdquo; - maybe\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ename\u003c/code\u003e the entities \u0026ldquo;name\u0026rdquo;, it may be possible to name your player character. For monsters it would typically say what kind of monster, for instance \u003ccode\u003eant\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esp\u003c/code\u003e holds the number of the sprite on the sprite sheet that should be used for this particular entity\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ex\u003c/code\u003e, \u003ccode\u003ey\u003c/code\u003e the current coordinates of the entity\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003espd\u003c/code\u003e how fast (far) the entity can move in one turn\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    move \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e(self, dx, dy)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      self.x \u003cspan style=\"color:#719e07\"\u003e+=\u003c/span\u003e dx\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      self.y \u003cspan style=\"color:#719e07\"\u003e+=\u003c/span\u003e dy\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003eend\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    attack \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e(self, tx, ty)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#586e75\"\u003e--\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThe generic entity will have some standard methods which may or may not call out to other functions within the cart. I\u0026rsquo;m not sure exactly what methods they will end up with, maybe just a few basics.\u003c/p\u003e\n\u003cp\u003eAs a quick and dirty example, this would allow us to do something like the following.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  ents\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    new_entity(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;monst\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;ant\u0026#34;\u003c/span\u003e, ant, xpos\u003cspan style=\"color:#719e07\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e16\u003c/span\u003e, ypos\u003cspan style=\"color:#719e07\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e16\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e8\u003c/span\u003e),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    new_entity(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;monst\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;ant\u0026#34;\u003c/span\u003e, ant, xpos\u003cspan style=\"color:#719e07\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e32\u003c/span\u003e, ypos\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e16\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e8\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNow we have two \u0026ldquo;ants\u0026rdquo; which we can then access using \u003ccode\u003eall()\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003efor\u003c/span\u003e e \u003cspan style=\"color:#268bd2\"\u003ein\u003c/span\u003e all(ents) \u003cspan style=\"color:#268bd2\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    spr(e.sp, e.x, e.y)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNow, we have two \u003ccode\u003ea\u003c/code\u003e ant\u0026rsquo;s on the screen. This will probably evolve over the weeks but that should be good to get started. That brings us to the next step of Part 2.\u003c/p\u003e\n\u003ch3 id=\"the-render-functions\"\u003eThe Render Functions\u003c/h3\u003e\n\u003cp\u003eThe \u003ca href=\"http://rogueliketutorials.com/tutorials/tcod/part-2/\"\u003etutorial render functions\u003c/a\u003e are each pretty straight forward.  I think we can use a very similar setup in Lua.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003erender_all\u003c/span\u003e(con, entities, screen_width, screen_height):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#586e75\"\u003e# Draw all entities in the list\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003efor\u003c/span\u003e entity \u003cspan style=\"color:#719e07\"\u003ein\u003c/span\u003e entities:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        draw_entity(con, entity)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    libtcod\u003cspan style=\"color:#719e07\"\u003e.\u003c/span\u003econsole_blit(con, \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e, screen_width, screen_height, \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003eclear_all\u003c/span\u003e(con, entities):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003efor\u003c/span\u003e entity \u003cspan style=\"color:#719e07\"\u003ein\u003c/span\u003e entities:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        clear_entity(con, entity)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003edraw_entity\u003c/span\u003e(con, entity):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    libtcod\u003cspan style=\"color:#719e07\"\u003e.\u003c/span\u003econsole_set_default_foreground(con, entity\u003cspan style=\"color:#719e07\"\u003e.\u003c/span\u003ecolor)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    libtcod\u003cspan style=\"color:#719e07\"\u003e.\u003c/span\u003econsole_put_char(con, entity\u003cspan style=\"color:#719e07\"\u003e.\u003c/span\u003ex, entity\u003cspan style=\"color:#719e07\"\u003e.\u003c/span\u003ey, entity\u003cspan style=\"color:#719e07\"\u003e.\u003c/span\u003echar, libtcod\u003cspan style=\"color:#719e07\"\u003e.\u003c/span\u003eBKGND_NONE)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003eclear_entity\u003c/span\u003e(con, entity):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#586e75\"\u003e# erase the character that represents this object\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    libtcod\u003cspan style=\"color:#719e07\"\u003e.\u003c/span\u003econsole_put_char(con, entity\u003cspan style=\"color:#719e07\"\u003e.\u003c/span\u003ex, entity\u003cspan style=\"color:#719e07\"\u003e.\u003c/span\u003ey, \u003cspan style=\"color:#2aa198\"\u003e\u0026#39; \u0026#39;\u003c/span\u003e, libtcod\u003cspan style=\"color:#719e07\"\u003e.\u003c/span\u003eBKGND_NONE)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWe aren\u0026rsquo;t too concerned about clearing at the moment so let\u0026rsquo;s just begin with drawing. Just like the Python example, we\u0026rsquo;ll make \u003ccode\u003erender_all()\u003c/code\u003e which will call \u003ccode\u003edraw_entity()\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003erender_all\u003c/span\u003e(ents)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003efor\u003c/span\u003e ent \u003cspan style=\"color:#268bd2\"\u003ein\u003c/span\u003e all(ents) \u003cspan style=\"color:#268bd2\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    draw_entity(ent)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003edraw_entity\u003c/span\u003e(ent)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  rectfill(ent.x, ent.y, ent.x\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e7\u003c/span\u003e, ent.y\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e7\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  spr(ent.sp, ent.x, ent.y)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSo our drawing snippet from above becomes:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  render_all(ents)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWe pass in all of our entities, each one is forwarded on for drawing, and then it appears on the screen.\u003c/p\u003e\n\u003cp\u003eSo far so good! You may have noticed that we\u0026rsquo;re using \u003ccode\u003erectfill()\u003c/code\u003e in \u003ccode\u003edraw_entity()\u003c/code\u003e. This is because when the map is drawn, the entire thing is drawn. We need to ensure we remove those elements when they are below an entity.\u003c/p\u003e\n\u003ch3 id=\"the-map\"\u003eThe Map\u003c/h3\u003e\n\u003cp\u003eThe tutorial version now goes off into creating a class for the game map. My Pico-8 version currently just uses \u003ccode\u003e_draw()\u003c/code\u003e to fill in our floor \u0026ldquo;tile\u0026rdquo; and our wall \u0026ldquo;tiles\u0026rdquo;. It\u0026rsquo;s pretty brute force for now. We\u0026rsquo;ll improve it while we work on our random generation a bit later on - likely in the next section or two.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-ruby\" data-lang=\"ruby\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003efunction _draw()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  cls(\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003efor\u003c/span\u003e iy\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e,\u003cspan style=\"color:#2aa198\"\u003e127\u003c/span\u003e,\u003cspan style=\"color:#2aa198\"\u003e8\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003efor\u003c/span\u003e ix\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e,\u003cspan style=\"color:#2aa198\"\u003e127\u003c/span\u003e,\u003cspan style=\"color:#2aa198\"\u003e8\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e ix \u003cspan style=\"color:#719e07\"\u003e==\u003c/span\u003e xpos \u003cspan style=\"color:#719e07\"\u003eand\u003c/span\u003e iy \u003cspan style=\"color:#719e07\"\u003e==\u003c/span\u003e ypos \u003cspan style=\"color:#719e07\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#719e07\"\u003e--\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      spr(flor, ix, iy)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003e--\u003c/span\u003e fill \u003cspan style=\"color:#719e07\"\u003ein\u003c/span\u003e left \u003cspan style=\"color:#719e07\"\u003eand\u003c/span\u003e right \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;walls\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003efor\u003c/span\u003e iy\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e,\u003cspan style=\"color:#2aa198\"\u003e127\u003c/span\u003e,\u003cspan style=\"color:#2aa198\"\u003e8\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    rectfill(\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e, iy, \u003cspan style=\"color:#2aa198\"\u003e7\u003c/span\u003e, iy\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e8\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    spr(wall, \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e, iy)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    rectfill(\u003cspan style=\"color:#2aa198\"\u003e120\u003c/span\u003e, iy, \u003cspan style=\"color:#2aa198\"\u003e128\u003c/span\u003e, iy\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e8\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    spr(wall, \u003cspan style=\"color:#2aa198\"\u003e120\u003c/span\u003e, iy)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003e--\u003c/span\u003e fill \u003cspan style=\"color:#719e07\"\u003ein\u003c/span\u003e top \u003cspan style=\"color:#719e07\"\u003eand\u003c/span\u003e bottom \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;walls\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003efor\u003c/span\u003e ix\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e,\u003cspan style=\"color:#2aa198\"\u003e127\u003c/span\u003e,\u003cspan style=\"color:#2aa198\"\u003e8\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    rectfill(ix, \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e, ix\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e8\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e7\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    spr(wall, ix, \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    rectfill(ix, \u003cspan style=\"color:#2aa198\"\u003e120\u003c/span\u003e, ix\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e8\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e128\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    spr(wall, ix, \u003cspan style=\"color:#2aa198\"\u003e120\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  spr(plyr, xpos, ypos)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#b58900\"\u003eprint\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;(\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e..\u003c/span\u003expos\u003cspan style=\"color:#719e07\"\u003e..\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;, \u0026#39;\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e..\u003c/span\u003eypos\u003cspan style=\"color:#719e07\"\u003e..\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;)\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e8\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e8\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e5\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  render_all(ents)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis renders a screen similar to the following table:\u003c/p\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003e0\u003c/th\u003e\n\u003cth\u003e1\u003c/th\u003e\n\u003cth\u003e2\u003c/th\u003e\n\u003cth\u003e3\u003c/th\u003e\n\u003cth\u003e4\u003c/th\u003e\n\u003cth\u003e5\u003c/th\u003e\n\u003cth\u003e6\u003c/th\u003e\n\u003cth\u003e7\u003c/th\u003e\n\u003cth\u003e8\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e1\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e2\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e3\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e4\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e5\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e6\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e7\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e8\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003ctd\u003e#\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch2 id=\"part-3---generating-a-dungeon\"\u003ePart 3 - Generating a dungeon\u003c/h2\u003e\n\u003cp\u003eOf course I\u0026rsquo;m a bit behind schedule so I haven\u0026rsquo;t quite finished my implementation of the dungeon carving routine. I\u0026rsquo;ve also have yet to put in collision. \u003ccode\u003ecreate_room()\u003c/code\u003e is a pretty straight forward function. We simply pass in the screen X,Y we want to start at and then the width and height of the room.  The Python implementation takes a \u0026ldquo;room\u0026rdquo; which we\u0026rsquo;re skipping over for now.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#719e07\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003ecreate_room\u003c/span\u003e(\u003cspan style=\"color:#268bd2\"\u003eself\u003c/span\u003e, room):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       \u003cspan style=\"color:#586e75\"\u003e# go through the tiles in the rectangle and make them passable\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       \u003cspan style=\"color:#719e07\"\u003efor\u003c/span\u003e x \u003cspan style=\"color:#719e07\"\u003ein\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003erange\u003c/span\u003e(room\u003cspan style=\"color:#719e07\"\u003e.\u003c/span\u003ex1 \u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e, room\u003cspan style=\"color:#719e07\"\u003e.\u003c/span\u003ex2):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e          \u003cspan style=\"color:#719e07\"\u003efor\u003c/span\u003e y \u003cspan style=\"color:#719e07\"\u003ein\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003erange\u003c/span\u003e(room\u003cspan style=\"color:#719e07\"\u003e.\u003c/span\u003ey1 \u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e, room\u003cspan style=\"color:#719e07\"\u003e.\u003c/span\u003ey2):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e              \u003cspan style=\"color:#268bd2\"\u003eself\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e.\u003c/span\u003etiles[x][y]\u003cspan style=\"color:#719e07\"\u003e.\u003c/span\u003eblocked \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e false\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e              \u003cspan style=\"color:#268bd2\"\u003eself\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e.\u003c/span\u003etiles[x][y]\u003cspan style=\"color:#719e07\"\u003e.\u003c/span\u003eblock_sight \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e false\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFor now we are simply going to return our table of X,Y coordinates and the sprite.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003ecreate_room\u003c/span\u003e(x,y,w,h)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003elocal\u003c/span\u003e obj\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e{}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003efor\u003c/span\u003e iy\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003ey,y\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003eh\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e,\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003efor\u003c/span\u003e ix\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003ex,x\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003ew\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e,\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      add(obj,{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       x\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003eix,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       y\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003eiy,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       sp\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003eflor\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     })\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003ereturn\u003c/span\u003e obj\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLet\u0026rsquo;s see if we can get the tunnel functions in real quick. Again, we just have a basic implementation  that returns a table of the coordinates we need to plot our \u0026ldquo;tunnels\u0026rdquo;.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003ecreate_h_tunnel\u003c/span\u003e(x1,x2,y)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003elocal\u003c/span\u003e obj\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e{}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003efor\u003c/span\u003e x\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003emin(x1,x2),max(x1,x2)\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e,\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    add(obj,{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       x\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003ex,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       y\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003ey,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       sp\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003eflor\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     })\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003ereturn\u003c/span\u003e obj\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003ecreate_v_tunnel\u003c/span\u003e(y1,y2,x)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003elocal\u003c/span\u003e obj\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e{}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003efor\u003c/span\u003e y\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003emin(y1,y2),max(y1,y2)\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e,\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    add(obj,{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       x\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003ex,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       y\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003ey,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       sp\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003eflor\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     })\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003ereturn\u003c/span\u003e obj\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLooks nice, right?\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/imgs/rl_tut_03.png\" alt=\"PICO-8\"\u003e\u003c/p\u003e\n\u003cp\u003eYeah, it\u0026rsquo;s missing the walls!\u003c/p\u003e\n\u003ch2 id=\"wrapping-up-for-now\"\u003eWrapping Up, For Now\u003c/h2\u003e\n\u003cp\u003eI\u0026rsquo;ll have to try and wrap the last bit of the weeks code and update the GitHub project over the next day or so. I\u0026rsquo;ll also need to change around how we are writing the \u0026ldquo;map\u0026rdquo; so we can take into account impassable terrain and get ready for field of view. Then we\u0026rsquo;ll try and place some more monsters!\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n"
    },
    {
      "title": "2020 Roguelikedev Tutorial Week 1",
      "date_published": "2020-06-21T23:20:29-07:00",
      "date_modified": "2020-06-21T23:20:29-07:00",
      "id": "https://shindakun.dev/posts/2020-roguelikedev-tutorial-week-1/",
      "url": "https://shindakun.dev/posts/2020-roguelikedev-tutorial-week-1/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003ch1 id=\"roguelikedev-does-the-complete-roguelike-tutorial\"\u003eRoguelikeDev Does The Complete Roguelike Tutorial\u003c/h1\u003e\n\u003ch2 id=\"week-1---june-16th---22nd-2020\"\u003eWeek 1 - June 16th - 22nd 2020\u003c/h2\u003e\n\u003ch2 id=\"introduction\"\u003eIntroduction\u003c/h2\u003e\n\u003cp\u003eWelcome back! It\u0026rsquo;s been a bit since my last post. The quarantine was not the boon I thought it would be for side projects. I haven\u0026rsquo;t really been motivated to do much of anything.\u003c/p\u003e\n\u003cp\u003eI thought I might take part in the Portland Indie Game Squads Summer Slow Jam but, that didn\u0026rsquo;t really work out so far. Instead I\u0026rsquo;m going to try to take part in the ==RoguelikeDev Does The Complete Roguelike Tutorial==\u0026hellip; and I\u0026rsquo;m already behind schedule.\u003c/p\u003e\n\u003cp\u003eBeyond that though I\u0026rsquo;ve decided to only loosely follow the tutorial. The first departure will be that I\u0026rsquo;m going to try to do it in \u003ca href=\"https://www.lexaloffle.com/pico-8.php\"\u003ePICO-8\u003c/a\u003e. Which hopefully won\u0026rsquo;t go that poorly. Since I already have PICO-8 installed I don\u0026rsquo;t really need to do much in the way of setup.\u003c/p\u003e\n\u003cp\u003e!arial10x10.png\u003c/p\u003e\n\u003cp\u003eUsing PICO-8 means I won\u0026rsquo;t be using \u003ccode\u003elibtcod\u003c/code\u003e but instead will be hacking away using \u003ccode\u003elua\u003c/code\u003e. I\u0026rsquo;ve only recently started messing with it so hopefully it goes OK. Instead of the Arial font you see above I\u0026rsquo;m going to try to make use of the PICO-8 font.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/imgs/pico8fnt.png\" alt=\"PICO-8 Font\"\u003e\u003c/p\u003e\n\u003cp\u003eThis may not work out though since the font is an odd size. I could always recreate the glyphs I need in the sprite editor and have a nice 8x8 sprite. That may work nicely, I\u0026rsquo;ll have to look into that - for now though lets get on with it.\u003c/p\u003e\n\u003ch2 id=\"part-0---setting-up\"\u003ePart 0 - Setting Up\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://rogueliketutorials.com/tutorials/tcod/part-0/\"\u003ehttp://rogueliketutorials.com/tutorials/tcod/part-0/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe tutorial starts out with getting \u003ccode\u003epython\u003c/code\u003e running and then writing ==HELLO WORLD== to verify its working. If you happen to have PICO-8 and want to follow along, boot it up and type in:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;hello world\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eHitting enter should cause the text \u0026ldquo;hello world\u0026rdquo; to be echoed on the next line before returning to the prompt. There we go!\u003c/p\u003e\n\u003cp\u003e!PICO-8_2.gif\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"part-1---drawing-the--symbol-and-moving-it-around\"\u003ePart 1 - Drawing the ‘@’ symbol and moving it around\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://rogueliketutorials.com/tutorials/tcod/part-1/\"\u003ehttp://rogueliketutorials.com/tutorials/tcod/part-1/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eWe are going to take the shortest route to completing our second goal for the week. Which might be a bit silly since we\u0026rsquo;ll likely switch over to sprite basing graphics, maybe. I haven\u0026rsquo;t quite decided. Alright lets see what we\u0026rsquo;ve got!\u003c/p\u003e\n\u003cp\u003eUpon booting a \u0026ldquo;cartridge\u0026rdquo; the system will run \u003ccode\u003e_init()\u003c/code\u003e. This can be used fro \u003cem\u003einitializing\u003c/em\u003e starting variables or \u0026ldquo;constraints\u0026rdquo;. Here we are going to set our base position to the center of the screen. We\u0026rsquo;ll use this when rendering our \u003ccode\u003e@\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003e_init\u003c/span\u003e()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  xpos \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e64\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  ypos \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e64\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThe PICO-8 \u0026ldquo;console\u0026rdquo; has what amounts to a built in game loop. Which we can make use of by using \u003ccode\u003e_draw()\u003c/code\u003e  and \u003ccode\u003e_update()\u003c/code\u003e. This allows us to draw to the screen and perform \u0026ldquo;updates\u0026rdquo; every 30 (or 60) frames. As seen below we use \u003ccode\u003e_update()\u003c/code\u003e to check for button presses and current position. Depending on what button was pressed and where we currently are on the screen we can then move our \u003ccode\u003e@\u003c/code\u003e about.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-lua\" data-lang=\"lua\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003e_draw\u003c/span\u003e()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  cls(\u003cspan style=\"color:#2aa198\"\u003e3\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  print(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;@\u0026#34;\u003c/span\u003e, xpos, ypos)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003e_update\u003c/span\u003e()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003eif\u003c/span\u003e (btnp(\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e) \u003cspan style=\"color:#719e07\"\u003eand\u003c/span\u003e xpos \u003cspan style=\"color:#719e07\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e) xpos \u003cspan style=\"color:#719e07\"\u003e-=\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003eif\u003c/span\u003e (btnp(\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e) \u003cspan style=\"color:#719e07\"\u003eand\u003c/span\u003e xpos \u003cspan style=\"color:#719e07\"\u003e\u0026lt;\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e127\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e5\u003c/span\u003e) xpos \u003cspan style=\"color:#719e07\"\u003e+=\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003eif\u003c/span\u003e (btnp(\u003cspan style=\"color:#2aa198\"\u003e2\u003c/span\u003e) \u003cspan style=\"color:#719e07\"\u003eand\u003c/span\u003e ypos \u003cspan style=\"color:#719e07\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e4\u003c/span\u003e) ypos \u003cspan style=\"color:#719e07\"\u003e-=\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003eif\u003c/span\u003e (btnp(\u003cspan style=\"color:#2aa198\"\u003e3\u003c/span\u003e) \u003cspan style=\"color:#719e07\"\u003eand\u003c/span\u003e ypos \u003cspan style=\"color:#719e07\"\u003e\u0026lt;\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e127\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e9\u003c/span\u003e) ypos \u003cspan style=\"color:#719e07\"\u003e+=\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003eend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIf you happen to pick up PICO-8 the above code can be copied into the editor. After that simply type \u003ccode\u003erun\u003c/code\u003e from the command line and enjoy moving about.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"wrapping-up\"\u003eWrapping Up\u003c/h2\u003e\n\u003cp\u003eI\u0026rsquo;ll be working over the next couple days to figure out a good release mechanism so I push builds to \u003ca href=\"https://shindakun.itch.io/\"\u003eitch.io\u003c/a\u003e and \u003ca href=\"https://github.com/shindakun\"\u003eGitHub\u003c/a\u003e. I suppose I could also release on the PICO-8 BBS once I have a \u0026ldquo;build\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eI am planning on also doing a read-through on the next two parts of the tutorial so I can decide if I need to switch to using sprites or if I should stick with \u0026ldquo;text\u0026rdquo;. If I can stay on track we should also see some more blog posts!\u003c/p\u003e\n\u003ch2 id=\"additional-resources\"\u003eAdditional Resources\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://www.lexaloffle.com/pico-8.php?page=manual\"\u003eThe PICO-8 Manual\u003c/a\u003e\n\u003ca href=\"https://reddit.com/r/roguelikedev\"\u003e/r/roguelikedev\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n"
    },
    {
      "title": "SDL2 Test 03 - Part 01",
      "date_published": "2020-03-31T23:33:03-07:00",
      "date_modified": "2020-03-31T23:33:03-07:00",
      "id": "https://shindakun.dev/posts/sdl2-test-03-part-01/",
      "url": "https://shindakun.dev/posts/sdl2-test-03-part-01/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003ch2 id=\"background\"\u003eBackground\u003c/h2\u003e\n\u003cp\u003eSo here we are at the end of month and what a crazy month it\u0026rsquo;s been. You may not be too surprised to hear that I\u0026rsquo;ve been trying to start this post for the last two weeks. It\u0026rsquo;s been quite crazy around here though so I never actually got around to doing it.\u003c/p\u003e\n\u003cp\u003eHowever, now that we are down to the wire I wanted to make sure at least I got a post up that covers a bit of what I wanted to have up today. We\u0026rsquo;ll have to wait a couple days until the demo programs up on \u003ca href=\"https://shindakun.itch.io/\"\u003eitch.io\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThis post is likely to be even shorter than our February post!\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"cellular-automata\"\u003eCellular Automata\u003c/h2\u003e\n\u003cp\u003eThis time around I\u0026rsquo;ll be posting up some information on my knock-off rendition of using cellular automata to dig out caves.\u003c/p\u003e\n\u003cp\u003eI know this is suppose to be an SDL2 post but we aren\u0026rsquo;t going to make that leap until the second part. A very small scale version might look like the text below.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHopefully this renders OK. 🤞\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e111111111111111111111111111111111111111111111111111111111111\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e111111111111111111111111111111111111111111000111111111100111\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e111111111111111111001110011111111111111000000011111110000011\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e111111111111111110000000001111111111110000000011111100000001\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e111111111111111100000000000111111111110000000011111100000001\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e111111111111110000000000000011111111110000000011111100000001\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e111111111111100000000000000001100001100000000001111100000001\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e111111111111100000000000000000000000000000000001111110000011\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e111111111111100000000000000000000000000000000001111111000011\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e111111111111000000000000000000000000000000000011111111100011\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e111111111110000000000000000000000000000000000011111111111111\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e111111111100000000000000000000000000000000000001110011111111\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e111111111000000000000000000000000000000000000000000001111111\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e111000000000000000000000000000000000000000000000000001111111\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e110000000000000000000000000000000000000000000000000000111111\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e110000000000000000000000000000000000000000000000000000000111\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e110000000000000000000000000000000000000000000000000000000011\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e110000000000000000000000000000000000000000000000000000000011\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e110000000000000000000000000000000000000000000000000000000011\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e110000000000000000000011000000000000000000000000000000000011\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e110000000000000000000111100000000000000000000000000000000011\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e111000000000000000000111100000000000000000000000000000000011\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e111000000000000000000111100000000000000000001110000000000011\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e111000000000000000000111000000000000000000011111000000000011\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e111000000000000000001111000000000000000000011111100000000011\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e111000000000000000001111100000000000000000011111110000000011\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e111000000000000000000111110000000000000000011111110000000011\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e111100000000000000000111111000000000000000111111110000000111\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e111110000001100110001111111111000111111111111111111001111111\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e111111111111111111111111111111111111111111111111111111111111\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCellular automata is broken up into several phases. First thing we are going to do is take a grid - which in our case above is I believe 30x60.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003efor\u003c/span\u003e x \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003erange\u003c/span\u003e l.Grid {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003efor\u003c/span\u003e y \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003erange\u003c/span\u003e l.Grid[x] {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e rand.\u003cspan style=\"color:#268bd2\"\u003eIntn\u003c/span\u003e(max\u003cspan style=\"color:#719e07\"\u003e-\u003c/span\u003emin)\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003emin \u0026lt; RandFill \u003cspan style=\"color:#719e07\"\u003e||\u003c/span\u003e x \u003cspan style=\"color:#719e07\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e||\u003c/span\u003e x \u003cspan style=\"color:#719e07\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003elen\u003c/span\u003e(l.Grid)\u003cspan style=\"color:#719e07\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e||\u003c/span\u003e y \u003cspan style=\"color:#719e07\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e||\u003c/span\u003e y \u003cspan style=\"color:#719e07\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003elen\u003c/span\u003e(l.Grid[x])\u003cspan style=\"color:#719e07\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        l.Grid[x][y] = \u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      } \u003cspan style=\"color:#719e07\"\u003eelse\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        l.Grid[x][y] = \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAlright, so, here\u0026rsquo;s our first stop we\u0026rsquo;re going to take our slice \u003ccode\u003eGrid\u003c/code\u003e and randomly fill in \u003ccode\u003e0\u003c/code\u003e or \u003ccode\u003e1\u003c/code\u003e. We loop all the way through (and may need to flip the \u003ccode\u003ex\u003c/code\u003e and \u003ccode\u003ey\u003c/code\u003e now that I\u0026rsquo;m looking at it) filling in each tile randomly. During this we are also checking to make sure that if we are on an edge that we fill in a \u003ccode\u003e1\u003c/code\u003e to wrap our \u0026ldquo;level\u0026rdquo; in walls so we don\u0026rsquo;t need to worry about wrapping around for now.\u003c/p\u003e\n\u003cp\u003eMaybe at some point we\u0026rsquo;ll extend this out so it is larger and have a wrapping world. But that\u0026rsquo;s beyond the scope of what I\u0026rsquo;d like to have accomplished by the end of the year.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"give-it-a-try\"\u003eGive It A Try\u003c/h2\u003e\n\u003cp\u003eInstead of giving it a try now, we\u0026rsquo;re going to need to hang on a couple of days. This months project isn\u0026rsquo;t very exciting as it is more just setting the stage for our next steps. But I\u0026rsquo;ll be putting up the example executables within the next week or so. I am aiming to have a much more in depth post up around the 10th to cover the past months work as well as bridge what is coming next\u0026hellip;.\u003c/p\u003e\n\u003cp\u003eAnyway until next time!\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n"
    },
    {
      "title": "SDL2 Test 02",
      "date_published": "2020-02-26T18:39:03-08:00",
      "date_modified": "2020-02-26T18:39:03-08:00",
      "id": "https://shindakun.dev/posts/sdl2-test-02/",
      "url": "https://shindakun.dev/posts/sdl2-test-02/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003ch2 id=\"background\"\u003eBackground\u003c/h2\u003e\n\u003cp\u003eWelcome back! Or welcome for the first time! If you do happen to be stopping by for the first time you may want to read \u003ca href=\"/posts/game-dev-2020/\"\u003ethe first\u003c/a\u003e \u003ca href=\"/posts/sdl2-test-01/\"\u003etwo posts\u003c/a\u003e in this little series.\u003c/p\u003e\n\u003cp\u003eOf course if you want to stay here you are most welcome. So, what are we doing?\u003c/p\u003e\n\u003cp\u003eCreating prototypes that can form together into something resembling a game.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"lets-get-shaking\"\u003eLets Get Shaking\u003c/h2\u003e\n\u003cp\u003eLooking back on our last post I noted at the end that it\u0026rsquo;d be nice to add a screen shake effect. Something say like this one:\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/imgs/sdl2-test02-01.gif\" alt=\"sdl2-test02\"\u003e\u003c/p\u003e\n\u003cp\u003eAs it turns out it is quite easy to do.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"camera\"\u003eCamera\u003c/h2\u003e\n\u003cp\u003eWe are going to use the camera position and alter it to achieve a shaking effect. The camera itself is an \u003ccode\u003esdl.Rect()\u003c/code\u003e that is the size of our output resolution. It doesn\u0026rsquo;t need to be an \u003ccode\u003esdl.Rect()\u003c/code\u003e, but this removes the need to declare a struct.\u003c/p\u003e\n\u003cp\u003eWe calculate the coordinate points of the rectangle relative to the player. Centering it around the “player character”. Unless it is near the edge of the “map”, then the edge is set to the background edge. A chunk of the background is then copied to the renderer using those coordinates. The player \u0026ldquo;sprite\u0026rdquo; is then copied over next. Since we are using the hardware render so we call \u003ccode\u003erenderer.Present()\u003c/code\u003e to “flip” the \u003ca href=\"https://wiki.libsdl.org/SDL_RenderPresent#Remarks\"\u003eback buffer\u003c/a\u003e to the screen.\u003c/p\u003e\n\u003cp\u003eLet\u0026rsquo;s see what our current camera looks like.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  camera \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e sdl.Rect{X: \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e, Y: \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e, W: wWidth, H: wHeight}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003e...\u003c/span\u003esnip\u003cspan style=\"color:#719e07\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  camera.X = \u003cspan style=\"color:#b58900\"\u003eint32\u003c/span\u003e((d.posX \u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e d.width\u003cspan style=\"color:#719e07\"\u003e/\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e2\u003c/span\u003e) \u003cspan style=\"color:#719e07\"\u003e-\u003c/span\u003e wWidth\u003cspan style=\"color:#719e07\"\u003e/\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e2\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  camera.Y = \u003cspan style=\"color:#b58900\"\u003eint32\u003c/span\u003e((d.posY \u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e d.height\u003cspan style=\"color:#719e07\"\u003e/\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e2\u003c/span\u003e) \u003cspan style=\"color:#719e07\"\u003e-\u003c/span\u003e wHeight\u003cspan style=\"color:#719e07\"\u003e/\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e2\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e camera.X \u0026lt; \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    camera.X = \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e camera.Y \u0026lt; \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    camera.Y = \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e camera.X \u0026gt; bgWidth\u003cspan style=\"color:#719e07\"\u003e-\u003c/span\u003ecamera.W {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    camera.X = bgWidth \u003cspan style=\"color:#719e07\"\u003e-\u003c/span\u003e camera.W\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e camera.Y \u0026gt; bgHeight\u003cspan style=\"color:#719e07\"\u003e-\u003c/span\u003ecamera.H {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    camera.Y = bgHeight \u003cspan style=\"color:#719e07\"\u003e-\u003c/span\u003e camera.H\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  renderer.\u003cspan style=\"color:#268bd2\"\u003eCopy\u003c/span\u003e(bg, \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003esdl.Rect{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    X: camera.X,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Y: camera.Y,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    W: wWidth,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    H: wHeight,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  },\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003esdl.Rect{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      X: \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      Y: \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      W: wWidth,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      H: wHeight,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    })\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNot very exciting is it.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"implementation\"\u003eImplementation\u003c/h2\u003e\n\u003cp\u003eTo keep this post short I\u0026rsquo;m not going to repeat all the code. I need to figure out how I\u0026rsquo;m going to put it up on GitHub. Do I want to use a single repo for all the code or split it up into sections? I should get that taken care of.\u003c/p\u003e\n\u003cp\u003eWe start outside our main game loop and do a bit of setup, with some initial values. Then after our camera bounding code, we check if \u003ccode\u003eshaking\u003c/code\u003e is \u003ccode\u003etrue\u003c/code\u003e. If it is we use the very inelegant \u003ccode\u003eshake * rand.Float64() * maxShake\u003c/code\u003e to get our camera offset. This might lead to the following values:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecamerax 184, cameray 228\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etargetx 3.421793651571817, targety 1.0282214265561018\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAdding \u003ccode\u003e184+3\u003c/code\u003e (we \u003ccode\u003ecast\u003c/code\u003e to \u003ccode\u003eint32\u003c/code\u003e which drops the decimals) gives us \u003ccode\u003e187\u003c/code\u003e for the \u003ccode\u003eX\u003c/code\u003e. Likewise, we add \u003ccode\u003e228+1\u003c/code\u003e and get \u003ccode\u003e229\u003c/code\u003e. This gives a jitter to the image since the value we\u0026rsquo;re adding will change every frame. We don\u0026rsquo;t have any negative offsets when done this way though. This isn\u0026rsquo;t the perfect screen shake but at this stage it will do. We can look into smoothing it a bit down the road.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  shaking \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  targetx \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e0.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  targety \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e0.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  shake \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e0.8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  maxShake \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003e...\u003c/span\u003esnip\u003cspan style=\"color:#719e07\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e camera.Y \u0026gt; bgHeight\u003cspan style=\"color:#719e07\"\u003e-\u003c/span\u003ecamera.H {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    camera.Y = bgHeight \u003cspan style=\"color:#719e07\"\u003e-\u003c/span\u003e camera.H\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e shaking {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    targetx = shake \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003e rand.\u003cspan style=\"color:#268bd2\"\u003eFloat64\u003c/span\u003e() \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003e maxShake\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    targety = shake \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003e rand.\u003cspan style=\"color:#268bd2\"\u003eFloat64\u003c/span\u003e() \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003e maxShake\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  renderer.\u003cspan style=\"color:#268bd2\"\u003eCopy\u003c/span\u003e(bg, \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003esdl.Rect{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    X: \u003cspan style=\"color:#b58900\"\u003eint32\u003c/span\u003e(targetx) \u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e camera.X,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Y: \u003cspan style=\"color:#b58900\"\u003eint32\u003c/span\u003e(targety) \u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e camera.Y,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    W: wWidth,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    H: wHeight,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  },\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003e...\u003c/span\u003esnip\u003cspan style=\"color:#719e07\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThe \u003ccode\u003erender.Copy()\u003c/code\u003e call now uses the original camera value and the shake offset. We don\u0026rsquo;t want to actually mutate the camera values since we need them once the shaking stops. It\u0026rsquo;s not visible here but the current code allows us to enable and disable shaking by pressing the \u003ccode\u003espace bar\u003c/code\u003e. In that bit of code I\u0026rsquo;m making sure to reset \u003ccode\u003etargetx\u003c/code\u003e and \u003ccode\u003etargety\u003c/code\u003e to \u003ccode\u003e0.0\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"wrapping-up\"\u003eWrapping Up\u003c/h2\u003e\n\u003cp\u003eA short month calls for a short post. We didn\u0026rsquo;t really set out to do to much this month but we accomplished a few things anyway. Besides this post, I finished my \u003ccode\u003emakefile\u003c/code\u003e! For now at least. I can build for Windows, macOS, and Linux and release to \u003ca href=\"https://shindakun.itch.io/\"\u003eitch.io\u003c/a\u003e pretty with no trouble. In theory I can also compile to \u003ca href=\"https://github.com/veandco/go-sdl2-examples/tree/master/examples/android\"\u003eAndroid\u003c/a\u003e (and maybe iOS).\u003c/p\u003e\n\u003cp\u003eI may switch gears a little and try to accomplish generating a \u0026ldquo;map\u0026rdquo; which will eventually be used as our base for a level. This is going to be \u003ca href=\"https://en.wikipedia.org/wiki/Cellular_automaton\"\u003ecellular automata\u003c/a\u003e based. I also may try to get an implementation \u003ca href=\"https://en.wikipedia.org/wiki/Diamond-square_algorithm\"\u003ediamond-square algorithm\u003c/a\u003e completed. At the very least I\u0026rsquo;m hoping to present something on screen for the cellular automata. Where we go after that I\u0026rsquo;m not quite sure yet.\u003c/p\u003e\n\u003cp\u003eAnyway until next time!\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"give-it-a-try\"\u003eGive It A Try\u003c/h2\u003e\n\u003cp\u003eI\u0026rsquo;ve added the prototype over on \u003ca href=\"https://shindakun.itch.io/sdl2-test02\"\u003eitch.io\u003c/a\u003e. It can be download for Windows, macOS, and Linux. Please give them a try and let me know if you have any issues.\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n"
    },
    {
      "title": "SDL2 Test 01",
      "date_published": "2020-01-31T22:27:02-08:00",
      "date_modified": "2020-01-31T22:27:02-08:00",
      "id": "https://shindakun.dev/posts/sdl2-test-01/",
      "url": "https://shindakun.dev/posts/sdl2-test-01/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003ch2 id=\"background\"\u003eBackground\u003c/h2\u003e\n\u003cp\u003eWelcome back! This is the first release of a few bits of SDL2/Go prototype code. The plan is to combine those bits together into a whole at some point. This method may work out well. We\u0026rsquo;ve had a good start on our build and release tooling. As part of that, we also have a very simple example of displaying an image on screen.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"looking-back\"\u003eLooking Back\u003c/h2\u003e\n\u003cp\u003eThe Windows build script worked as expected! You may need to install the \u003ca href=\"https://www.libsdl.org/download-2.0.php\"\u003eSDL2 binaries\u003c/a\u003e but after that, you should be good to go. We will have to look into distributing the DLLs along with the package. The previous SDL logo test Windows and macOS versions are over on \u003ca href=\"https://shindakun.itch.io/sdl2-test00\"\u003eitch.io\u003c/a\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"next-steps\"\u003eNext Steps\u003c/h2\u003e\n\u003cp\u003eThis time around we\u0026rsquo;re going to put together a small 240x160 window. It will act window (or camera) into a larger 1440x960 background image. We even have a small 8x16 \u0026ldquo;thing\u0026rdquo; that we can move around the space. This will serve us well down the road and is usable in all types of games.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/imgs/sdl2-test01-01.png\" alt=\"sdl2-test01\"\u003e\u003c/p\u003e\n\u003ch2 id=\"camera\"\u003eCamera\u003c/h2\u003e\n\u003cp\u003e\u003cimg src=\"/imgs/sdl2-test01-camera.png\" alt=\"wow look at that drawing\"\u003e\u003c/p\u003e\n\u003cp\u003eThe basic idea is we have a large background but we only need to render a small part of that to the screen. First we need our camera, so we use \u003ccode\u003esdl.Rect{}\u003c/code\u003e and create a rectangle the same size as our display window. Note that this is an example, not the full implementation. At some point most of this code should be on \u003ca href=\"https://github.com/shindakun\"\u003eGitHub\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  camera \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e sdl.Rect{X: \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e, Y: \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e, W: wWidth, H: wHeight}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWe want to constrain the camera in such a way that the \u0026ldquo;thing\u0026rdquo; we are moving around will be near the center of the window. We do this by taking the \u0026ldquo;things\u0026rdquo; current position (plus half its width/height) and dividing the X and Y by half the windows width and height.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  camera.X = \u003cspan style=\"color:#b58900\"\u003eint32\u003c/span\u003e((d.posX \u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e d.width\u003cspan style=\"color:#719e07\"\u003e/\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e2\u003c/span\u003e) \u003cspan style=\"color:#719e07\"\u003e-\u003c/span\u003e wWidth\u003cspan style=\"color:#719e07\"\u003e/\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e2\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  camera.Y = \u003cspan style=\"color:#b58900\"\u003eint32\u003c/span\u003e((d.posY \u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e d.height\u003cspan style=\"color:#719e07\"\u003e/\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e2\u003c/span\u003e) \u003cspan style=\"color:#719e07\"\u003e-\u003c/span\u003e wHeight\u003cspan style=\"color:#719e07\"\u003e/\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e2\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWe then constrain the camera to keep it from rendering \u0026ldquo;off-screen\u0026rdquo;. This allows the \u0026ldquo;thing\u0026rdquo; to continue moving toward the edges and have the camera unbound so it doesn\u0026rsquo;t follow.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e camera.X \u0026lt; \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    camera.X = \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e camera.Y \u0026lt; \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    camera.Y = \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e camera.X \u0026gt; bgWidth\u003cspan style=\"color:#719e07\"\u003e-\u003c/span\u003ecamera.W {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    camera.X = bgWidth \u003cspan style=\"color:#719e07\"\u003e-\u003c/span\u003e camera.W\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e camera.Y \u0026gt; bgHeight\u003cspan style=\"color:#719e07\"\u003e-\u003c/span\u003ecamera.H {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    camera.Y = bgHeight \u003cspan style=\"color:#719e07\"\u003e-\u003c/span\u003e camera.H\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNow we are free to take a chunk of our background texture, which matches the cameras coordinates. \u003ccode\u003erenderer.Copy()\u003c/code\u003e allows us to copy that chunk to the destination is our current renderer.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  renderer.\u003cspan style=\"color:#268bd2\"\u003eCopy\u003c/span\u003e(bg, \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003esdl.Rect{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    X: camera.X,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Y: camera.Y,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    W: wWidth,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    H: wHeight,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  },\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003esdl.Rect{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      X: \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      Y: \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      W: wWidth,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      H: wHeight,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    })\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWe then do the same thing with our \u0026ldquo;thing\u0026rdquo;. We draw it to the screen on top of the background as centered as need be. And that\u0026rsquo;s all there is to it!\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/imgs/sdl2-test01-02.gif\" alt=\"moving the thing around\"\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"give-it-a-try\"\u003eGive It A Try\u003c/h2\u003e\n\u003cp\u003eLike last time I have release the demo version over on \u003ca href=\"https://shindakun.itch.io/sdl2-test01\"\u003eitch.io\u003c/a\u003e. Both Windows and macOS versions are up for download. Please give them a try and let me know if they run at all. The movement code is a bit off when the \u0026ldquo;thing\u0026rdquo; gets near the edges. I will look into updating that as I have time.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"next-up\"\u003eNext Up\u003c/h2\u003e\n\u003cp\u003eI\u0026rsquo;m not quite sure what I\u0026rsquo;m going to work on next. I do want to do some internal tooling to make the initial project setup easier. But that won\u0026rsquo;t count toward next months release. Maybe I\u0026rsquo;ll work on a little bit of procedural generation. It\u0026rsquo;d be nice to generate the background or map rather then drawing a shoddy picture in Aseprite. Or we could work on adding camera shake - can\u0026rsquo;t call yourself indie if you don\u0026rsquo;t have that massive shake!\u003c/p\u003e\n\n\n    \n    \u003cdiv style=\"position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;\"\u003e\n      \u003ciframe allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen=\"allowfullscreen\" loading=\"eager\" referrerpolicy=\"strict-origin-when-cross-origin\" src=\"https://www.youtube.com/embed/AJdEqssNZ-U?autoplay=0\u0026controls=1\u0026end=0\u0026loop=0\u0026mute=0\u0026start=0\" style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;\" title=\"YouTube video\"\n      \u003e\u003c/iframe\u003e\n    \u003c/div\u003e\n\n\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n"
    },
    {
      "title": "Game Dev 2020",
      "date_published": "2020-01-29T19:09:12-08:00",
      "date_modified": "2020-01-29T19:09:12-08:00",
      "id": "https://shindakun.dev/posts/game-dev-2020/",
      "url": "https://shindakun.dev/posts/game-dev-2020/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003ch2 id=\"background\"\u003eBackground\u003c/h2\u003e\n\u003cp\u003eHaving grown up with the rise of entertainment software I have a pretty long history with gaming. As part of that, I\u0026rsquo;ve flirted off and on with making games. This takes the form of some general messing around. I\u0026rsquo;ll do that until something else catches my scattered attention.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve been thinking since the beginning of the year that I want to try to cobble something together. I\u0026rsquo;d be a good reason for me to blog and gives me a nice excuse to continue messing around with Go and SDL2. Why Go? Because it\u0026rsquo;s portable, I can compile to Windows, macOS, and Linux with ease.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"the-plan\"\u003eThe Plan\u003c/h2\u003e\n\u003cp\u003eI\u0026rsquo;m planning on trying to release something at the end of every month. It will not be a complete game. Only little bits and pieces that we can put together into a whole at some point.\u003c/p\u003e\n\u003cp\u003eEach piece will get its own page over at \u003ca href=\"https://shindakun.itch.io/\"\u003eitch.io\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eAs part of this, I want to first tackle a release process. I\u0026rsquo;ve decided to do using a \u003ccode\u003emakefile\u003c/code\u003e. Each project will have the same base layout so I\u0026rsquo;ll write a small helper script (in Go) to help with that.\u003c/p\u003e\n\u003cp\u003eI imagine I\u0026rsquo;ll end up with something very like the following. It\u0026rsquo;s pretty close to what I already have. macOS and Windows will need to separate build but the Linux build can happen in Docker. That won\u0026rsquo;t come until the second (or third) release. If I do add it, new builds of older releases get updated.\u003c/p\u003e\n\u003cp\u003eThe layout will look a bit like the following.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esdl2-test00\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e│   main.go\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e|   makefile\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e│   README.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e|\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e└───assets\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e│   │   background.png\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e│\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e└───buildfiles\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e|   │   README.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e|\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e└───macos_buildfiles\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e|   │   Info.plist\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e|\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e└───windows_buildfiles\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    |   SDL2.dll\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"makefile\"\u003emakefile\u003c/h2\u003e\n\u003cp\u003eBelow you can see an example of my current \u003ccode\u003emakefile\u003c/code\u003e. It\u0026rsquo;s not quite done but it\u0026rsquo;s getting close enough. I need to do some tweaking to pull the main \u003ccode\u003eBINARY_NAME\u003c/code\u003e from the current directory. To keep this post short I\u0026rsquo;ve trimmed out a bit and only left the macOS related.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-makefile\" data-lang=\"makefile\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003eGOCMD\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003ego\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003eGOBUILD\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eGOCMD\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e build\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003eGOCLEAN\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eGOCMD\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e clean\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003eGOTEST\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eGOCMD\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003etest\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003eGOGET\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eGOCMD\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e get\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003eITCH_ACCOUNT\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eHANDLE\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003eITCH_GAME_URI\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003enotdir \u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eshell \u003cspan style=\"color:#b58900\"\u003epwd\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003eBINARY_VER\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e?=\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eshell git tag\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003eBINARY_NAME\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003esdl2-test00\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003eBINARY_DARWIN\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eBINARY_NAME\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003eRELEASE_DARWIN\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003erelease-darwin\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003eall\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e clean deps build\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003ebuild\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  @echo 💻 Building\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  @\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eGOBUILD\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e -o \u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eBINARY_NAME\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e -v\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003eclean\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  @echo 🧹 Cleaning up\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  @\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eGOCLEAN\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  @echo ⚠️ Removing binaries\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  @rm -f \u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eBINARY_NAME\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  @rm -f \u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eBINARY_LINUX\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  @rm -f \u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eBINARY_WIN\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e# Danger ;)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e  @echo ⚠️ Removing release directories\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  @rm -rf ./\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eRELEASE_WIN\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  @rm -rf ./\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eRELEASE_LINUX\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  @rm -rf ./\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eRELEASE_DARWIN\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  @echo 🧹 Done cleaning\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003erelease-darwin\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  @echo 💻 Creating \u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eRELEASE_DARWIN\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e/\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eBINARY_DARWIN\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e-\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eBINARY_VER\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e.app folders\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  @mkdir -p \u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eRELEASE_DARWIN\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e/\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eBINARY_DARWIN\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e-\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eBINARY_VER\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e.app/Contents/MacOS\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  @mkdir -p \u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eRELEASE_DARWIN\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e/\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eBINARY_DARWIN\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e-\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eBINARY_VER\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e.app/Contents/PlugIns\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  @mkdir -p \u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eRELEASE_DARWIN\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e/\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eBINARY_DARWIN\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e-\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eBINARY_VER\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e.app/Contents/Resources\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  @echo 💻 Building \u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eRELEASE_DARWIN\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e/\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eBINARY_DARWIN\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e-\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eBINARY_VER\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  @GOOS\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003edarwin \u003cspan style=\"color:#268bd2\"\u003eGOARCH\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003eamd64 \u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eGOBUILD\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e -ldflags\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;-s -w\u0026#34;\u003c/span\u003e -o \u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eRELEASE_DARWIN\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e/\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eBINARY_DARWIN\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e-\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eBINARY_VER\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e.app/Contents/MacOS/\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eBINARY_DARWIN\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e-\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eBINARY_VER\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e -v\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  @echo 💻 Copying assets\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  @cp -r ./assets \u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eRELEASE_DARWIN\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e/\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eBINARY_DARWIN\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e-\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eBINARY_VER\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e.app/Contents/MacOS/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  @cp ./macos_buildfiles/Info.plist \u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eRELEASE_DARWIN\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e/\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eBINARY_DARWIN\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e-\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eBINARY_VER\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e.app/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  @# cp -r ./macos_buildfiles/icons.icns \u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eRELEASE_DARWIN\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e/\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eBINARY_DARWIN\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e-\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eBINARY_VER\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e.app/Contents/Resources/\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eBINARY_DARWIN\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e-\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eBINARY_VER\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  @echo 💻 Uploading to itch.io\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  @butler push \u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eRELEASE_DARWIN\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eITCH_ACCOUNT\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e/\u003cspan style=\"color:#719e07\"\u003e$(\u003c/span\u003eITCH_GAME_URI\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e:mac\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThe idea is to make building and releasing easier up front. To that end, I\u0026rsquo;ve worked on building out putting together a \u003ccode\u003e.app\u003c/code\u003e package which can then be immediately released to \u003ccode\u003eitch.io\u003c/code\u003e. I did my test release last night. It can be found over on \u003ca href=\"https://shindakun.itch.io/sdl2-test00\"\u003eitch.io\u003c/a\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n"
    },
    {
      "title": "Adding a Book Cover Shortcode for Hugo",
      "date_published": "2020-01-01T03:05:29-08:00",
      "date_modified": "2020-01-01T03:05:29-08:00",
      "id": "https://shindakun.dev/posts/adding-a-book-cover-shortcode-for-hugo/",
      "url": "https://shindakun.dev/posts/adding-a-book-cover-shortcode-for-hugo/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003ch2 id=\"background\"\u003eBackground\u003c/h2\u003e\n\u003cp\u003eThere has been some chatter on the micro.blog timeline about adding some better tools for book covers when sharing book suggestions, etc. \u003ca href=\"https://micro.blog/michaelfransen/7433727\"\u003e@michaelfransen\u003c/a\u003e started off asking about a gallery of images similar to the way the Photos page works. As the conversation went on \u003ca href=\"https://micro.blog/jsonbecker/7446478\"\u003e@jsonbecker\u003c/a\u003e brought up the idea of ISBN to cover image inside of a Hugo data page.\u003c/p\u003e\n\u003cp\u003eThere are a few services that have APIs that should get the image, Goodreads (Amazon) and Google Books are the biggest. Since Hugo can grab JSON when building pages it is possible to just use a short-code to build out what you\u0026rsquo;d need for a naive implementation.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"drawbacks\"\u003eDrawbacks\u003c/h2\u003e\n\u003cp\u003eWhile looking into this I noticed that both the Goodreads and Google APIs have their problems. On the Google side of things not every result is going to have larger image sizes:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;imageLinks\u0026#34;\u003c/span\u003e: {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;smallThumbnail\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;http://books.google.com/books/content?id=DRlhnQEACAAJ\u0026amp;printsec=frontcover\u0026amp;img=1\u0026amp;zoom=5\u0026amp;source=gbs_api\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003e\u0026#34;thumbnail\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;http://books.google.com/books/content?id=DRlhnQEACAAJ\u0026amp;printsec=frontcover\u0026amp;img=1\u0026amp;zoom=1\u0026amp;source=gbs_api\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e},\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eYou can change the \u0026ldquo;zoom\u0026rdquo; but that doesn\u0026rsquo;t result in an image sadly. Other than that the Google API works pretty much as we\u0026rsquo;d need. \u003ca href=\"https://www.googleapis.com/books/v1/volumes?q=isbn:1932234411\"\u003eSearch for an ISBN\u003c/a\u003e and get an object back with results! Oh but wait\u0026hellip; there are a bunch of ISBNs that return no cover image.\u003c/p\u003e\n\u003cp\u003eNot to worry, Goodreads can help us out there. After all, they have the Amazon library of images along with crowd sourced covers. Except in order to look up books on Goodreads you need the ID - and the API call to \u003ca href=\"https://www.goodreads.com/api/index#book.isbn_to_id\"\u003elook up the ID by ISBN\u003c/a\u003e doesn\u0026rsquo;t work. And, from what I\u0026rsquo;ve read, isn\u0026rsquo;t very reliable when it does. Also, it responds with XML so, that won\u0026rsquo;t help.\u003c/p\u003e\n\u003cp\u003eThe final draw back would be that the images aren\u0026rsquo;t \u0026ldquo;download\u0026rdquo; they would be linked from the Goodreads or Google hosting where they are stored. That may not seem like a drawback but at some point they will stop allowing the images to be linked from certain referring domains.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"overcoming-obstacles\"\u003eOvercoming Obstacles\u003c/h2\u003e\n\u003cp\u003eSince Google can\u0026rsquo;t be relied on we going to move them to backup status. We\u0026rsquo;ll use Goodreads as the primary source and fallback as needed.\u003c/p\u003e\n\u003cp\u003eThat still presents us with the problem of the Goodreads API not working. Well, it turns out the workaround for that is pretty easy. I noticed that if you searched for an ISBN in on the main page you would get a single response with what I was looking for.\u003c/p\u003e\n\u003cp\u003eTaking a look in Chrome console I was pleased to discover that the search GET request returns a nice JSON object.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;imageUrl\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1388494987i/38379._SY75_.jpg\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;bookId\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;38379\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;workId\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;1921329\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;bookUrl\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;/book/show/38379.Ring\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;from_search\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#cb4b16\"\u003etrue\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;qid\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;Xoh78SXtTz\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;rank\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;Ring (Ring, #1)\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;bookTitleBare\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;Ring\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;numPages\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e282\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;avgRating\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;3.82\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;ratingsCount\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e13682\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;author\u0026#34;\u003c/span\u003e: {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;id\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e14465\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;Kōji Suzuki\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;isGoodreadsAuthor\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#cb4b16\"\u003efalse\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;profileUrl\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;https://www.goodreads.com/author/show/14465.K_ji_Suzuki\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;worksListUrl\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;https://www.goodreads.com/author/list/14465.K_ji_Suzuki\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    },\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;kcrPreviewUrl\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#cb4b16\"\u003enull\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;description\u0026#34;\u003c/span\u003e: {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;html\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;A mysterious videotape warns that the viewer will die in one week unless a certain, unspecified act is performed. Exactly one week after watching the tape, four teenagers die…\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;truncated\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#cb4b16\"\u003etrue\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;fullContentUrl\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;https://www.goodreads.com/book/show/38379.Ring\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWhat\u0026rsquo;s more, we have an image URL right there in the response!\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1388494987i/38379._SY75_.jpg\" alt=\"Ring cover\"\u003e\u003c/p\u003e\n\u003cp\u003eAlmost! If only this image was the full cover. It turns out that it is, sort of. If we drop the \u003ccode\u003e._SY75_\u003c/code\u003e we\u0026rsquo;ll see the \u0026ldquo;full size image\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1388494987i/38379.jpg\" alt=\"Ring cover\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eSY75\u003c/code\u003e seems to be some sort of scaling, maybe. If you play around with that you can get back different size images up to what is likely the maximum size. Now we are getting somewhere and we have enough to create our basic short-code!\u003c/p\u003e\n\u003cp\u003eBut first, let\u0026rsquo;s talk about the third drawback - the eventual loss of images. The way the short-code would work is to build out an \u003ccode\u003e\u0026lt;img\u0026gt;\u003c/code\u003e link, Hugo can\u0026rsquo;t download the images. This means the image data remains on a remote server. I can envision one way to work on getting out from under that which would not require attempting to mirror all the images. A simple proxy which looked locally for downloaded images before passing the request upstream would work. This would be \u0026ldquo;easy\u0026rdquo; to setup I think - but it\u0026rsquo;s beyond what we are trying to do right now.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"shortcode\"\u003eShortcode\u003c/h2\u003e\n\u003cp\u003eI am still new to working with Hugo templating so there may be better methods to accomplish this but it works. In my theme I have a file at \u003ccode\u003elayouts/shortcodes/book.html\u003c/code\u003e. Here we\u0026rsquo;ll take a closer look at what is in it, the complete code can be found a bit further down. I think I may need to make a short-code repo on GitHub as well. I\u0026rsquo;ll add a link here if/when I do.\u003c/p\u003e\n\u003cp\u003eFirst, we\u0026rsquo;ll declare a variable and assign the URL to an image that says \u0026ldquo;image not available\u0026rdquo;. We\u0026rsquo;ll use this as our image if nothing comes back from the API.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ $fin := \u0026#34;https://books.google.com/books/content?id=DRlhnQEACAAJ\u0026amp;printsec=frontcover\u0026amp;img=1\u0026amp;zoom=2\u0026amp;source=gbs_api\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNext we will set our API URLs. We\u0026rsquo;ll also put together our query parameters. This sets us up to use \u003ccode\u003egetJSON\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ $grUrlPre := \u0026#34;https://www.goodreads.com/book/auto_complete\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ $googUrlPre := \u0026#34;https://www.googleapis.com/books/v1/volumes\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ $grIsbn := printf \u0026#34;%s%s\u0026#34; \u0026#34;?format=json\u0026amp;q=\u0026#34; .Params.isbn }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ $googIsbn := printf \u0026#34;%s%s\u0026#34; \u0026#34;?q=isbn:\u0026#34; .Params.isbn }}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWe make two calls out to the APIs. I thought about checking one and then the other only if needed. In the end though I think it keeps the snippet much easier to read. After all what\u0026rsquo;s one more \u003ccode\u003eGET\u003c/code\u003e request? Anyway, we store the resulting object in a variable.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ $grJ := getJSON $grUrlPre $grIsbn }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ $googJ := getJSON $googUrlPre $googIsbn }}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSince we are more concerned with Goodreads we\u0026rsquo;ll check that first to make sure that the length of the object is larger then 0. If it is then we next assign the first object within the response to a variable. Within that object we\u0026rsquo;ll pull out the \u003ccode\u003eimageUrl\u003c/code\u003e value and using regular expression select and replace the \u0026ldquo;scaling\u0026rdquo; tag, \u003ccode\u003e._SY75_.\u003c/code\u003e with just a \u003ccode\u003e.\u003c/code\u003e. That\u0026rsquo;s the end so just write out or final HTML.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ if gt (len $grJ) 0 }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  {{ $i := index $grJ 0 }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  {{ $fin := replaceRE \u0026#34;._.*_.\u0026#34; \u0026#34;.\u0026#34; $i.imageUrl }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u0026lt;\u003cspan style=\"color:#268bd2\"\u003eimg\u003c/span\u003e src\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;{{ $fin }}\u0026#34;\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;book_cover\u0026#34;\u003c/span\u003e/\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eBut, what if?! Well, we can carry on over to the Google API response if needed. We start of the same, checking that the response has data. If it does have data again we assume that the first portion of the object is what we want. In this example, because we can\u0026rsquo;t be sure if a larger image exists I am using \u003ccode\u003evolumeInfo.imageLinks.thumbnail\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ else if gt ($googJ.totalItems) 0 }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  {{ $i := index $googJ.items 0 }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u0026lt;\u003cspan style=\"color:#268bd2\"\u003eimg\u003c/span\u003e src\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;{{ $i.volumeInfo.imageLinks.thumbnail }}\u0026#34;\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;book_cover\u0026#34;\u003c/span\u003e/\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAnd if all that went off the rails? The we default to displaying our image not available image.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ else}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u0026lt;\u003cspan style=\"color:#268bd2\"\u003eimg\u003c/span\u003e src\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;{{ $fin }} class=\u0026#34;\u003c/span\u003ebook_cover\u0026#34;\u0026#34;/\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cblockquote\u003e\n\u003cp\u003elayouts/shortcodes/book.html\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ $fin := \u0026#34;https://books.google.com/books/content?id=DRlhnQEACAAJ\u0026amp;printsec=frontcover\u0026amp;img=1\u0026amp;zoom=2\u0026amp;source=gbs_api\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ $grUrlPre := \u0026#34;https://www.goodreads.com/book/auto_complete\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ $googUrlPre := \u0026#34;https://www.googleapis.com/books/v1/volumes\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ $grIsbn := printf \u0026#34;%s%s\u0026#34; \u0026#34;?format=json\u0026amp;q=\u0026#34; .Params.isbn }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ $googIsbn := printf \u0026#34;%s%s\u0026#34; \u0026#34;?q=isbn:\u0026#34; .Params.isbn }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ $grJ := getJSON $grUrlPre $grIsbn }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ $googJ := getJSON $googUrlPre $googIsbn }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  {{ if gt (len $grJ) 0 }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ $i := index $grJ 0 }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ $fin := replaceRE \u0026#34;._.*_.\u0026#34; \u0026#34;.\u0026#34; $i.imageUrl }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#268bd2\"\u003eimg\u003c/span\u003e src\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;{{ $fin }}\u0026#34;\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;book_cover\u0026#34;\u003c/span\u003e/\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  {{ else if gt ($googJ.totalItems) 0 }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ $i := index $googJ.items 0 }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#268bd2\"\u003eimg\u003c/span\u003e src\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;{{ $i.volumeInfo.imageLinks.thumbnail }}\u0026#34;\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;book_cover\u0026#34;\u003c/span\u003e/\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  {{ else}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#268bd2\"\u003eimg\u003c/span\u003e src\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;{{ $fin }}\u0026#34;\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;book_cover\u0026#34;\u003c/span\u003e/\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  {{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"usage\"\u003eUsage\u003c/h2\u003e\n\u003cp\u003eThat\u0026rsquo;s great but how does it work? Next time you are writing a post add:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-txt\" data-lang=\"txt\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{\u0026amp;lt; book isbn=\u0026#34;9781493415465\u0026#34; \u0026amp;gt;}}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cblockquote\u003e\n\u003cp\u003eNote, that Hugo was having a heck of a time not actually using this as a short-code. You may need to covert the great-than and less-than signs back to symbols\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIf all goes well you should see your cover image. Note that we have done no styling so you could end up with an image that\u0026rsquo;s to larger (or even too small).\u003c/p\u003e\n\u003cp\u003eOver the next little while I\u0026rsquo;ll see if we can get our covers to display as a gallery, like the photos do. Until next time\u0026hellip;\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n"
    },
    {
      "title": "Webmentions are Great (Mostly)",
      "date_published": "2019-12-26T22:54:29-08:00",
      "date_modified": "2019-12-27T21:49:09-08:00",
      "id": "https://shindakun.dev/posts/webmentions-are-great-mostly/",
      "url": "https://shindakun.dev/posts/webmentions-are-great-mostly/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003ch2 id=\"oh-no\"\u003eOh No\u003c/h2\u003e\n\u003cp\u003eWhy are there two author icons?! We\u0026rsquo;ll get back to that in a moment.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"webmetion-bliss\"\u003eWebmetion Bliss\u003c/h2\u003e\n\u003cp\u003eAfter setting up and \u003ca href=\"https://shindakun.dev/posts/adding-webmentions-to-microblog/\"\u003edocumenting\u003c/a\u003e how I deployed webmentions on micro.blog it got picked up by a few people on the site! That was really nice - especially since it worked for the most part. I attempted to make it as clear as possible so others could follow in my footsteps and I succeeded - a few people got set up and were running with mentions. There is a great example over on \u003ca href=\"https://miraz.me/2019/12/21/thanks-to-shindakun.html\"\u003eMiraz Jordan\u0026rsquo;s\u003c/a\u003e site, which you can see a snippet of below.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/imgs/webmentions-great-01.png\" alt=\"webmentions-great-01\"\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"the-troubles\"\u003eThe Troubles\u003c/h2\u003e\n\u003cp\u003eAll is not perfect though. So, I thought I\u0026rsquo;d touch on some of that here. First, if you were to look at the interactions on Miraz\u0026rsquo;s site you would see some \u0026ldquo;likes\u0026rdquo; down near the bottom that rendered with just an icon and a data. Those posts came from \u003ca href=\"https://www.mathewpacker.com/2019/12/2523/\"\u003eMathew Packer\u003c/a\u003e testing out site to site replies.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/imgs/webmentions-great-02.png\" alt=\"webmentions-great-02\"\u003e\u003c/p\u003e\n\u003cp\u003eFor some reason those are coming out of webmention.io with what looks to be incorrectly parsed values. Note the \u003ccode\u003e''\u003c/code\u003e where you would expect a comment or, more likely, a title to appear.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esentence: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;https://www.mathewpacker.com/2019/12/2523/ posted \u0026#39;\u0026#39; linking to https://miraz.me/2019/12/21/thanks-to-shindakun.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThough in this case it doesn\u0026rsquo;t matter since we are not rendering the \u003ccode\u003esentence\u003c/code\u003e (or \u003ccode\u003esentence_html\u003c/code\u003e). I believe the JSON issue might be why the original implementation for webmention.js didn\u0026rsquo;t show \u0026ldquo;shares\u0026rdquo; or \u0026ldquo;likes\u0026rdquo; with text and just showed an author picture and name. I don\u0026rsquo;t use Wordpress so I am not sure just how far I may troubleshoot that - seems like the \u0026ldquo;Post Kinds\u0026rdquo; plugin might not be formatting the post 100% correctly.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"problems-at-home\"\u003eProblems at Home\u003c/h2\u003e\n\u003cp\u003eThat brings us back to the header image. A few days after the post went up I back ported my changes to my local Hugo theme and pushed them live. Within a day or so I had a few interactions.\u003ca href=\"https://boffosocko.com/2019/12/22/55762703/\"\u003eChris Aldrich\u003c/a\u003e posted a reply to a post by \u003ca href=\"https://jlelse.blog/thoughts/2019/12/indieweb-dream/\"\u003eJan-Lukas Else\u003c/a\u003e which linked back to the implementation post. However, it was showing two author photos.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/imgs/webmentions-great-00.png\" alt=\"webmentions-great-00\"\u003e\u003c/p\u003e\n\u003cp\u003eAt first I figured that the JavaScript parsing the webmention data was incorrect. However, nothing jumped out as an issue. I then used a \u003ca href=\"https://pin13.net/mf2/?url=https%3A%2F%2Fboffosocko.com%2F2019%2F12%2F22%2F55762703%2F\"\u003emicroformat2 parser\u003c/a\u003e to see if I could pin down the cause from the original mention.\u003c/p\u003e\n\u003cp\u003eBehold! It turns out that within the reply post \u003ca href=\"https://jetpack.com/support/lazy-images/\"\u003eJetpack Lazy Image\u003c/a\u003e loading is causing the reply-to author block to end up with an array of images. This seems to bubble back up through the content that webmentions.io is sending to my page.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/imgs/webmentions-great-03.png\" alt=\"webmentions-great-03\"\u003e\u003c/p\u003e\n\u003cp\u003eIn this case I could render the \u003ccode\u003esentence_html\u003c/code\u003e and not the content but then I\u0026rsquo;d lose out some nice conversation context.\u003c/p\u003e\n\u003cp\u003eI noticed one other thing that I\u0026rsquo;ll need to keep an eye out for and see if I can work around. Most replies aren\u0026rsquo;t going to have a title so you may end up with something like the following, where what we are replying to is blank.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/imgs/webmentions-great-05.png\" alt=\"webmentions-great-04\"\u003e\u003c/p\u003e\n\u003cp\u003eI have some off looking replies on the webmention post mostly due to bad CSS. And the fact that I appear to have messed up the CSS I was using for content with no author image isn\u0026rsquo;t great. It makes it difficult to see if the issue is something I\u0026rsquo;ve done.\u003c/p\u003e\n\u003cp\u003eI should get those fixed up\u0026hellip; and then I need to take a much closer look at the \u003ccode\u003ewebmention.js\u003c/code\u003e and it\u0026rsquo;s associated CSS.\u003c/p\u003e\n\u003cp\u003eAck! Seems rendering the entire content load of a \u0026ldquo;share\u0026rdquo; means an entire article might get shared. Will have to look at that closer as well, maybe tomorrow.\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n"
    },
    {
      "title": "Adding Webmentions To micro.blog",
      "date_published": "2019-12-13T23:16:31-08:00",
      "date_modified": "2019-12-21T09:33:09-08:00",
      "id": "https://shindakun.dev/posts/adding-webmentions-to-microblog/",
      "url": "https://shindakun.dev/posts/adding-webmentions-to-microblog/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003cblockquote\u003e\n\u003cp\u003eLast update 12/21/19\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eremoved reply count buttons HTML and JS\u003c/li\u003e\n\u003cli\u003eadding a note about switching to native micro.blog webmentions in the future\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePast updates\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eadded \u003ccode\u003e\u0026lt;ul\u0026gt;\u003c/code\u003e for shares back in\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"background\"\u003eBackground\u003c/h2\u003e\n\u003cp\u003eAs part of getting back into using micro.blog I\u0026rsquo;ve been working to customize my hosted site. One of the things I wanted to do was add webmentions rather then comments like Disqus. Webmentions are coming to MB at some point and most themes already contain references to them:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#268bd2\"\u003elink\u003c/span\u003e rel\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;webmention\u0026#34;\u003c/span\u003e href\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;https://micro.blog/webmention\u0026#34;\u003c/span\u003e /\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eI didn\u0026rsquo;t want to wait though and we don\u0026rsquo;t need to thanks to \u003ca href=\"https://webmention.io/\"\u003eWebmention.io\u003c/a\u003e! I\u0026rsquo;m going to try and document exactly what I did through this post. Parts of it will be specific to the theme I\u0026rsquo;m using, \u003ca href=\"https://github.com/microdotblog/theme-hello\"\u003eHello\u003c/a\u003e in this case but, hopefully will have enough detail that anyone can follow.\u003c/p\u003e\n\u003ch3 id=\"to-be-clear-if-you-use-this-method-you-may-lose-some-mentions-sent-to-the-external-endpoint-if-you-switch-from-webmentionsio-back-to-the-native-microblog-webmention-endpoint-once-its-live\"\u003eTo be clear, if you use this method you may lose some mentions sent to the external endpoint if you switch from webmentions.io back to the native micro.blog webmention endpoint once it\u0026rsquo;s live\u003c/h3\u003e\n\u003cp\u003eThis isn\u0026rsquo;t new territory but I thought it\u0026rsquo;d be nice to record exactly what I did to get this working on micro.blog. In fact, I hacked most of this in place based on code released by \u003ca href=\"https://keithjgrant.com/posts/2019/02/adding-webmention-support-to-a-static-site/\"\u003eKeith Grant\u003c/a\u003e. Thanks Keith!\u003c/p\u003e\n\u003ch2 id=\"pre-requisites\"\u003ePre-requisites\u003c/h2\u003e\n\u003cp\u003eTo get started you really only need a few things:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003ea micro.blog hosted blog or a static website you want to add webmentions to\u003c/li\u003e\n\u003cli\u003ea custom theme\u003c/li\u003e\n\u003cli\u003ebasic web development skills (some HTML/JavaScript)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eAs I mentioned in the \u003ca href=\"https://shindakun.dev/posts/adding-an-image-lightbox-to-microblog/\"\u003elightbox post\u003c/a\u003e, @manton has a great \u003ca href=\"https://www.youtube.com/watch?v=MLUWnrMKVdg\"\u003eYouTube video\u003c/a\u003e which covers the basics of getting up and running with a theme. I will be referring to the web based editor but you don\u0026rsquo;t really need to use that if you want to make changes locally and then push to Git.\u003c/p\u003e\n\u003ch2 id=\"webmention\"\u003eWebmention\u003c/h2\u003e\n\u003cp\u003eFirst thing to do is to visit \u003ca href=\"https://webmention.io/\"\u003eWebmention.io\u003c/a\u003e. Here we\u0026rsquo;re going to paste in our Micro.blog URL.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/imgs/webmentions-01.png\" alt=\"webmention-01\"\u003e\u003c/p\u003e\n\u003cp\u003eAfter signing in we\u0026rsquo;ll be brought to the dash board. We are currently only concerned about the to \u003ccode\u003e\u0026lt;link\u0026gt;\u003c/code\u003e\u0026rsquo;s in the setup section.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/imgs/webmentions-02.png\" alt=\"webmention-02\"\u003e\u003c/p\u003e\n\u003ch2 id=\"headspace\"\u003eHeadSpace\u003c/h2\u003e\n\u003cp\u003eStep one out of the way we\u0026rsquo;ll need to edit our theme header to include these links. In this example I\u0026rsquo;m using the Hyde theme. From here on this will vary from theme to theme but hopefully not too much.\u003c/p\u003e\n\u003cp\u003eWe need to, at this point make sure we\u0026rsquo;ve read up on \u003ca href=\"https://help.micro.blog/2019/about-themes/\"\u003ecustom themes\u003c/a\u003e. I can wait, take your time. Go head and switch over to a custom theme if you aren\u0026rsquo;t already using one.\u003c/p\u003e\n\u003cp\u003eAlight lets continue.\u003c/p\u003e\n\u003cp\u003eTo get to the micro.blog theme editor goto your \u0026ldquo;Posts\u0026rdquo; page, then click on \u0026ldquo;Design\u0026rdquo;. Scroll down and click on \u0026ldquo;Edit Custom Themes\u0026rdquo;. Now choose the theme you want to edit.\u003c/p\u003e\n\u003cp\u003eYou should now see something similar to the following.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/imgs/webmentions-03.png\" alt=\"webmentions-03\"\u003e\u003c/p\u003e\n\u003cp\u003eWe\u0026rsquo;ll first edit \u003ccode\u003elayouts/partials/head.html\u003c/code\u003e. Again this may be slightly different for the theme you are using. Our first change is to pull out the micro.blog webmentions placeholder. So find:\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/imgs/webmentions-04.png\" alt=\"webmentions-04\"\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#268bd2\"\u003elink\u003c/span\u003e rel\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;webmention\u0026#34;\u003c/span\u003e href\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;https://micro.blog/webmention\u0026#34;\u003c/span\u003e /\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFound it! Now paste our webmentions.io links in it\u0026rsquo;s place. For me that would be:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#268bd2\"\u003elink\u003c/span\u003e rel\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;webmention\u0026#34;\u003c/span\u003e href\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;https://webmention.io/shindakun-test.micro.blog/webmention\u0026#34;\u003c/span\u003e /\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#268bd2\"\u003elink\u003c/span\u003e rel\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;pingback\u0026#34;\u003c/span\u003e href\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;https://webmention.io/shindakun-test.micro.blog/xmlrpc\u0026#34;\u003c/span\u003e /\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eClick \u0026ldquo;Update Template\u0026rdquo; button to save changes. One down.\u003c/p\u003e\n\u003ch2 id=\"htmling\"\u003eHTMLing\u003c/h2\u003e\n\u003cp\u003eAlright, now we should get some stuff into the template in order to actually show the mentions. This will be kind of barebones and may not be very pretty, I\u0026rsquo;ll leave the CSSing to the reader - that comes later though. For now we need to edit our single post HTML. For Hyde that is \u003ccode\u003elayouts/post/single.html\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/imgs/webmentions-05.png\" alt=\"webmentions-05\"\u003e\u003c/p\u003e\n\u003cp\u003eIf you look at the screenshot above you\u0026rsquo;ll see about where we are going to add our HTML. For now we\u0026rsquo;ll put it after the \u003ccode\u003e\u0026lt;div\u0026gt;\u003c/code\u003e that is just under \u003ccode\u003e{{ .Content }}\u003c/code\u003e. And below you can find that HTML - I decided it was easiest to just include it here, even though its quite a big block.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u0026lt;!-- First we have out reply and like template HTML --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#268bd2\"\u003etemplate\u003c/span\u003e id\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;reply-template\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u0026lt;\u003cspan style=\"color:#268bd2\"\u003eli\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;h-entry\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;comment-note\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;comment-note__avatar\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ea\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;js-author\u0026#34;\u003c/span\u003e href\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e          \u0026lt;\u003cspan style=\"color:#268bd2\"\u003eimg\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;comment-avatar u-photo js-avatar\u0026#34;\u003c/span\u003e src\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e/\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ea\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;comment-note__body\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;p-author\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e          \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ea\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;comment-author u-author js-author-name\u0026#34;\u003c/span\u003e href\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u0026gt;\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ea\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e          \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ea\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;comment-timestamp u-url js-date js-source\u0026#34;\u003c/span\u003e href\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u0026gt;\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ea\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;comment-body js-content e-entry\u0026#34;\u003c/span\u003e\u0026gt;\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u0026lt;/\u003cspan style=\"color:#268bd2\"\u003eli\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003etemplate\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#268bd2\"\u003etemplate\u003c/span\u003e id\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;like-template\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u0026lt;\u003cspan style=\"color:#268bd2\"\u003eli\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;h-entry\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;reply h-card p-author\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ea\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;reply__bar u-url js-source\u0026#34;\u003c/span\u003e href\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;reply__author p-name js-sentence js-author-name\u0026#34;\u003c/span\u003e href\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u0026gt;\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;reply__date js-date\u0026#34;\u003c/span\u003e href\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u0026gt;\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ea\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u0026lt;\u003cspan style=\"color:#268bd2\"\u003ea\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;reply__avatar u-author js-author\u0026#34;\u003c/span\u003e href\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u0026lt;\u003cspan style=\"color:#268bd2\"\u003eimg\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;u-photo js-avatar\u0026#34;\u003c/span\u003e src\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e/\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ea\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u0026lt;/\u003cspan style=\"color:#268bd2\"\u003eli\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003etemplate\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u0026lt;!-- The webmentions.js file we look at in a bit will fill out our lists --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#268bd2\"\u003eul\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;replies\u0026#34;\u003c/span\u003e id\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;replies\u0026#34;\u003c/span\u003e\u0026gt;\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003eul\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#268bd2\"\u003eul\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;likes\u0026#34;\u003c/span\u003e id\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;likes\u0026#34;\u003c/span\u003e\u0026gt;\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003eul\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#268bd2\"\u003eul\u003c/span\u003e class\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;shares\u0026#34;\u003c/span\u003e id\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;shares\u0026#34;\u003c/span\u003e\u0026gt;\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003eul\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e id\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;comments\u0026#34;\u003c/span\u003e\u0026gt;\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u0026lt;!-- I\u0026#39;m including this here to make sure it\u0026#39;s only used on the single post page. We\u0026#39;ll get into this a bit later. --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#268bd2\"\u003escript\u003c/span\u003e type\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;text/javascript\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#b58900\"\u003edocument\u003c/span\u003e.addEventListener(\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;DOMContentLoaded\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e () {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    fetchWebmentions({{ .Permalink }}, {{ .Aliases }});\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  });\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003escript\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOnce more, click on \u0026ldquo;Update Template\u0026rdquo; to save our changes. Saving brings us back to the template file list - which works out quite nicely.\u003c/p\u003e\n\u003ch2 id=\"javascripty\"\u003eJavaScripty\u003c/h2\u003e\n\u003cp\u003eOn the file list screen click the \u0026ldquo;New Template\u0026rdquo; button. This should really say \u0026ldquo;New File\u0026rdquo; since we\u0026rsquo;re not creating a whole new template but\u0026hellip; We should now be looking at an empty text-box. This time we need to note where we want this file to be, in my case to stick with the theme convention I\u0026rsquo;ll use \u003ccode\u003estatic/js/webmentions.js\u003c/code\u003e. This path may change slightly depending on how the theme or you want it to be - for instance in the Hello theme it might be \u003ccode\u003estatic/assets/webmentions.js\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/imgs/webmentions-06.png\" alt=\"webmentions-06\"\u003e\u003c/p\u003e\n\u003cp\u003eInto the actual code text-box we\u0026rsquo;ll need to paste the following JavaScript. There\u0026rsquo;s quite a bit. I\u0026rsquo;ve tested this on two micro.blog sites and it seems to work OK, your milage may vary though. I\u0026rsquo;m going to put a few comments in just to try and describe a bit of what\u0026rsquo;s happening in places. I\u0026rsquo;m not going to go to crazy though so a little JavaScript to general programming knowledge is probably helpful here.\u003c/p\u003e\n\u003cp\u003eYou\u0026rsquo;ll need to supply you\u0026rsquo;re own anonymous avatar image for any mentions that don\u0026rsquo;t have an image.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// You will need to supply an image, for MB hosted blogs I\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// recommend uploading  to the image gallery and then pasting\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// the link in here\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\u003cspan style=\"color:#268bd2\"\u003econst\u003c/span\u003e ANON_AVATAR \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;/images/anon-avatar.png\u0026#39;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// fetchWebmentions retireves the actual messages for the URL\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// passed in. First we check to see if we\u0026#39;re on a page that\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// has a comment `div` and then if no URL is passed in we\u0026#39;ll\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// put one together from the current page and fetch webmentions.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e fetchWebmentions(url, aliases) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e (\u003cspan style=\"color:#719e07\"\u003e!\u003c/span\u003e\u003cspan style=\"color:#b58900\"\u003edocument\u003c/span\u003e.getElementById(\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;comments\u0026#39;\u003c/span\u003e)) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e (\u003cspan style=\"color:#719e07\"\u003e!\u003c/span\u003eurl) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    url \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003edocument\u003c/span\u003e.location.origin \u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003edocument\u003c/span\u003e.location.pathname;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003econst\u003c/span\u003e targets \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e getUrlPermutations(url, aliases);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e script \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003edocument\u003c/span\u003e.createElement(\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;script\u0026#39;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e src \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;https://webmention.io/api/mentions?perPage=500\u0026amp;jsonp=parseWebmentions\u0026#39;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  targets.forEach(\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e(targetUrl) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    src \u003cspan style=\"color:#719e07\"\u003e+=\u003c/span\u003e \u003cspan style=\"color:#586e75\"\u003e`\u0026amp;target[]=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#b58900\"\u003eencodeURIComponent\u003c/span\u003e(targetUrl)\u003cspan style=\"color:#2aa198\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#586e75\"\u003e`\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  });\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  src \u003cspan style=\"color:#719e07\"\u003e+=\u003c/span\u003e \u003cspan style=\"color:#586e75\"\u003e`\u0026amp;_=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#b58900\"\u003eMath\u003c/span\u003e.random()\u003cspan style=\"color:#2aa198\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#586e75\"\u003e`\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  script.src \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e src;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  script.\u003cspan style=\"color:#268bd2\"\u003easync\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003etrue\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#b58900\"\u003edocument\u003c/span\u003e.getElementsByTagName(\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;head\u0026#39;\u003c/span\u003e)[\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e].appendChild(script);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// getUrlPermutations builds up a list of potential URLs to\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// check for mentions on. You will need to update the URLs\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// to point to your own MB instance. The `localhost:1313` one\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// can probably be removed unless your going to be testing\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// the theme locally with Hugo.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e getUrlPermutations(url, aliases) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003econst\u003c/span\u003e urls \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e [];\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  url \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e url.replace(\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;http://localhost:1313\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;https://shindakun-test.micro.blog/\u0026#39;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  urls.push(url);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  urls.push(url.replace(\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;https://\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;http://\u0026#39;\u003c/span\u003e));\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e (url.substr(\u003cspan style=\"color:#719e07\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e) \u003cspan style=\"color:#719e07\"\u003e===\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;/\u0026#39;\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e noslash \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e url.substr(\u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e, url.length \u003cspan style=\"color:#719e07\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    urls.push(noslash);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    urls.push(noslash.replace(\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;https://\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;http://\u0026#39;\u003c/span\u003e));\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e (aliases) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    aliases.forEach(\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e(alias) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      urls.push(\u003cspan style=\"color:#586e75\"\u003e`https://shindakun-test.micro.blog/\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e${\u003c/span\u003ealias\u003cspan style=\"color:#2aa198\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#586e75\"\u003e`\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    });\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e urls;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e parseWebmentions(data) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e links \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e data.links.sort(wmSort);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e likes \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e [];\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e reposts \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e [];\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e replies \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e [];\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  links.map(\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e(l) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e (\u003cspan style=\"color:#719e07\"\u003e!\u003c/span\u003el.activity \u003cspan style=\"color:#719e07\"\u003e||\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e!\u003c/span\u003el.activity.type) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      console.warning(\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;unknown link type\u0026#39;\u003c/span\u003e, l);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e (\u003cspan style=\"color:#719e07\"\u003e!\u003c/span\u003el.verified) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003eswitch\u003c/span\u003e (l.activity.type) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#719e07\"\u003ecase\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;like\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        likes.push(l);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#719e07\"\u003ebreak\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#719e07\"\u003ecase\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;repost\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#719e07\"\u003ecase\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;link\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        reposts.push(l);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#719e07\"\u003ebreak\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#719e07\"\u003edefault\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        replies.push(l);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#719e07\"\u003ebreak\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  });\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  renderLikes(likes);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  renderReposts(reposts);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  renderReplies(replies);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  showInteractions();\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#b58900\"\u003ewindow\u003c/span\u003e.parseWebmentions \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e parseWebmentions;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e wmSort(a, b) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003econst\u003c/span\u003e dateA \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e getWmDate(a);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003econst\u003c/span\u003e dateB \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e getWmDate(b);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e (dateA \u003cspan style=\"color:#719e07\"\u003e\u0026lt;\u003c/span\u003e dateB) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  } \u003cspan style=\"color:#719e07\"\u003eelse\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e (dateB \u003cspan style=\"color:#719e07\"\u003e\u0026lt;\u003c/span\u003e dateA) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e getWmDate(webmention) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e (webmention.data.published) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003eDate\u003c/span\u003e(webmention.data.published);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003eDate\u003c/span\u003e(webmention.verified_date);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e months \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e [\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;Jan\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;Feb\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;Mar\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;Apr\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;May\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;Jun\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;Jul\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;Aug\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;Sep\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;Oct\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;Nov\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;Dec\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e];\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e renderLikes(likes) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e t \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003edocument\u003c/span\u003e.getElementById(\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;like-template\u0026#39;\u003c/span\u003e).content;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e list \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003edocument\u003c/span\u003e.getElementById(\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;likes\u0026#39;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  likes.map(\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e(l) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    console.log(l)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    fillTemplate(t, {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      photo\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e l.data.author.photo \u003cspan style=\"color:#719e07\"\u003e||\u003c/span\u003e ANON_AVATAR,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      name\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e l.data.author.name,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      authorUrl\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e l.data.author.url,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      url\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e l.data.url,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      sentence\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e l.activity.sentence,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      date\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003eDate\u003c/span\u003e(l.data.published \u003cspan style=\"color:#719e07\"\u003e||\u003c/span\u003e l.verified_date),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    });\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e clone \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003edocument\u003c/span\u003e.importNode(t, \u003cspan style=\"color:#cb4b16\"\u003etrue\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    list.appendChild(clone);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  });\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e getHostName(url) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e a \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003edocument\u003c/span\u003e.createElement(\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  a.href \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e url;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e (a.hostname \u003cspan style=\"color:#719e07\"\u003e||\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e).replace(\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;www.\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e renderReposts(reposts) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e t \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003edocument\u003c/span\u003e.getElementById(\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;like-template\u0026#39;\u003c/span\u003e).content;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e list \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003edocument\u003c/span\u003e.getElementById(\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;shares\u0026#39;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  reposts.map(\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e(l) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003elet\u003c/span\u003e data;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e (l.data.author) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      data \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        photo\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e l.data.author.photo \u003cspan style=\"color:#719e07\"\u003e||\u003c/span\u003e ANON_AVATAR,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        name\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e l.data.author.name,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        authorUrl\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e l.data.author.url,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        url\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e l.data.url,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        date\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003eDate\u003c/span\u003e(l.data.published \u003cspan style=\"color:#719e07\"\u003e||\u003c/span\u003e l.verified_date),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      };\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    } \u003cspan style=\"color:#719e07\"\u003eelse\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      data \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        photo\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e ANON_AVATAR,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        name\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e getHostName(l.data.url) \u003cspan style=\"color:#719e07\"\u003e||\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;inbound link\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        authorUrl\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e l.data.url,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        url\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e l.data.url,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        date\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003eDate\u003c/span\u003e(l.data.published \u003cspan style=\"color:#719e07\"\u003e||\u003c/span\u003e l.verified_date),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      };\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    fillTemplate(t, data);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e clone \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003edocument\u003c/span\u003e.importNode(t, \u003cspan style=\"color:#cb4b16\"\u003etrue\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    list.appendChild(clone);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  });\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e renderReplies(replies) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e t \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003edocument\u003c/span\u003e.getElementById(\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;reply-template\u0026#39;\u003c/span\u003e).content;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e list \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003edocument\u003c/span\u003e.getElementById(\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;replies\u0026#39;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  replies.map(\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e(l) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003elet\u003c/span\u003e data;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e (l.data.author) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      data \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        photo\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e l.data.author.photo \u003cspan style=\"color:#719e07\"\u003e||\u003c/span\u003e ANON_AVATAR,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        name\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e l.data.author.name,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        authorUrl\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e l.data.author.url,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        url\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e l.data.url,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        date\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003eDate\u003c/span\u003e(l.data.published \u003cspan style=\"color:#719e07\"\u003e||\u003c/span\u003e l.verified_date),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        content\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e l.data.content,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      };\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    } \u003cspan style=\"color:#719e07\"\u003eelse\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      data \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        photo\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e ANON_AVATAR,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        name\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e getHostName(l.data.url) \u003cspan style=\"color:#719e07\"\u003e||\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;inbound link\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        authorUrl\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e l.data.url,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        url\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e l.data.url,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        date\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003enew\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003eDate\u003c/span\u003e(l.data.published \u003cspan style=\"color:#719e07\"\u003e||\u003c/span\u003e l.verified_date),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        content\u003cspan style=\"color:#719e07\"\u003e:\u003c/span\u003e l.data.content,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      };\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    fillTemplate(t, data);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e clone \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003edocument\u003c/span\u003e.importNode(t, \u003cspan style=\"color:#cb4b16\"\u003etrue\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    list.appendChild(clone);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  });\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// fillTemplate marries a signle webmention to the\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// template. The completed template is used in the\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// render functions to actually display on the page.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e fillTemplate(template, vals) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  template.querySelector(\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;.js-avatar\u0026#39;\u003c/span\u003e).src \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e vals.photo;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  template.querySelector(\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;.js-author\u0026#39;\u003c/span\u003e).href \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e vals.authorUrl;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  template.querySelector(\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;.js-author-name\u0026#39;\u003c/span\u003e).innerHTML \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e vals.name;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  template.querySelector(\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;.js-author-name\u0026#39;\u003c/span\u003e).href \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e vals.authorUrl;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  template.querySelector(\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;.js-source\u0026#39;\u003c/span\u003e).href \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e vals.url;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e (vals.sentence) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    template.querySelector(\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;.js-sentence\u0026#39;\u003c/span\u003e).innerText \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e vals.sentence;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003econst\u003c/span\u003e date \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e template.querySelector(\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;.js-date\u0026#39;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e (date) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    date.innerHTML \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e formatDate(vals.date);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e (vals.content) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    template.querySelector(\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;.js-content\u0026#39;\u003c/span\u003e).innerHTML \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e vals.content;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// formatDate formats the date.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e formatDate(date) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e (\u003cspan style=\"color:#719e07\"\u003e!\u003c/span\u003edate) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#586e75\"\u003e`\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e${\u003c/span\u003edate.getDate()\u003cspan style=\"color:#2aa198\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#586e75\"\u003e \u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e${\u003c/span\u003emonths[date.getMonth()]\u003cspan style=\"color:#2aa198\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#586e75\"\u003e \u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e${\u003c/span\u003edate.getFullYear()\u003cspan style=\"color:#2aa198\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#586e75\"\u003e`\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// This is leftover from the original implmentation,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// commented out since I don\u0026#39;t use it in my version.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// Maybe I should just remove it for clarity sake.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// ¯\\_(ツ)_/¯\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\u003cspan style=\"color:#268bd2\"\u003efunction\u003c/span\u003e showInteractions() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#586e75\"\u003e// document.getElementById(\u0026#39;comments-loader\u0026#39;).classList.add(\u0026#39;is-hidden\u0026#39;);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e \u003cspan style=\"color:#586e75\"\u003e// document.getElementById(\u0026#39;comments\u0026#39;).classList.remove(\u0026#39;is-hidden\u0026#39;);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eI recommend reading it through even if you don\u0026rsquo;t understand all of it \u0026hellip;\u003c/p\u003e\n\u003cp\u003eNow save the file which brings us back to the file list.\u003c/p\u003e\n\u003ch2 id=\"back-to-the-head\"\u003eBack to the Head\u003c/h2\u003e\n\u003cp\u003eJavaScript in place we now need to go back into the header file \u003ccode\u003elayouts/partials/head.html\u003c/code\u003e. Scroll all the way down and just before the \u003ccode\u003e\u0026lt;/head\u0026gt;\u003c/code\u003e past in:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#268bd2\"\u003escript\u003c/span\u003e src\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;{{ \u0026#34;\u003c/span\u003ejs/webmentions.js\u0026#34; | relURL }}\u0026#34;\u0026gt;\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003escript\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAnd save the file.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/imgs/webmentions-07.png\" alt=\"webmentions-07\"\u003e\u003c/p\u003e\n\u003ch2 id=\"mission-accomplished\"\u003eMission Accomplished\u003c/h2\u003e\n\u003cp\u003eWe did it! Technically we\u0026rsquo;re all done at this point. If we were to look at a post on our side we should see something like the following from my \u003ca href=\"https://shindakun-test.micro.blog/2019/11/28/testing.html\"\u003etest site\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/imgs/webmentions-08.png\" alt=\"webmentions-08\"\u003e\u003c/p\u003e\n\u003cp\u003eNeat!\u003c/p\u003e\n\u003cp\u003eAlright but how can we tell if it\u0026rsquo;s really working? \u003ca href=\"https://webmention.rocks/\"\u003eWebmention Rocks\u003c/a\u003e will help us make sure everything is actually working as it should. The site has a number of tests to ensure your site is set up and ready to go. But for the purposes of this post we are mostly interested in the receiver tests. First one is first I suppose - visit \u003ca href=\"https://webmention.rocks/receive/1\"\u003ehttps://webmention.rocks/receive/1\u003c/a\u003e and enter the URL of your site to sign-in.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/imgs/webmentions-09.png\" alt=\"webmentions-09\"\u003e\u003c/p\u003e\n\u003cp\u003ePerfect! Now lets enter a URL from one of our MB posts.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/imgs/webmentions-10.png\" alt=\"webmentions-10\"\u003e\u003c/p\u003e\n\u003cp\u003eIf all went well you should see something similar to the following image.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/imgs/webmentions-11.png\" alt=\"webmentions-11\"\u003e\u003c/p\u003e\n\u003cp\u003eAwesome! Now go over to the same page on MB and refresh\u0026hellip;\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/imgs/webmentions-12.png\" alt=\"webmentions-12\"\u003e\u003c/p\u003e\n\u003cp\u003eYes the image Webmention Rocks uses is pretty big by default but, who cares we have one webmention! Alright, I care\u0026hellip; For best results you\u0026rsquo;ll want to use some CSS to style the replies. I have left that out since that\u0026rsquo;s a but outside what we are trying to do and I don\u0026rsquo;t really enjoy mucking about with CSS.\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n"
    },
    {
      "title": "Adding an Image Lightbox To micro.blog",
      "date_published": "2019-12-06T23:15:31-08:00",
      "date_modified": "2019-12-30T22:11:17-08:00",
      "id": "https://shindakun.dev/posts/adding-an-image-lightbox-to-microblog/",
      "url": "https://shindakun.dev/posts/adding-an-image-lightbox-to-microblog/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003ch2 id=\"background\"\u003eBackground\u003c/h2\u003e\n\u003cp\u003eA day or so ago someone posted in one of the micro.blog slack channels asking how to add a lightbox. I had been meaning to update my setup here on the blog and add a lightbox since my current images weren\u0026rsquo;t linked. Mostly though, I wanted to get rid of jQuery. So with that in mind we\u0026rsquo;re going to go through the first steps of adding a lightbox. We\u0026rsquo;ll first add it so images in individual post are linked. This also lays some of the ground work for us to extend the \u0026ldquo;photos\u0026rdquo; page to include a lightbox.\u003c/p\u003e\n\u003ch2 id=\"finding-a-lightbox\"\u003eFinding A Lightbox\u003c/h2\u003e\n\u003cp\u003eThe first step was to find a \u0026ldquo;modern\u0026rdquo; lightbox solution. As I mentioned the majority of older solutions used jQuery and I don\u0026rsquo;t want another dependancy. jQuery is great and all but, I\u0026rsquo;m trying to watch my overall page weight. After some searching around I settled on \u003ca href=\"https://biati-digital.github.io/glightbox/\"\u003eGLightbox\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"hugo-themes\"\u003eHugo Themes\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://micro.blog\"\u003emicro.blog\u003c/a\u003e, like this site, uses \u003ca href=\"https://gohugo.io/\"\u003eHugo\u003c/a\u003e for hosted blogs. This setup allows to have control over the theme so we can easily pick a custom theme and extend it with our gallery script. One thing to take note of - I am using the \u003ca href=\"https://github.com/microdotblog/theme-hello\"\u003eHello\u003c/a\u003e and while this should work on any Hugo there will be differences if you are using another theme.\u003c/p\u003e\n\u003ch2 id=\"glightbox-js-and-css\"\u003eGLightbox JS and CSS\u003c/h2\u003e\n\u003cp\u003eGLightbox is very easy to install which makes it perfect for this. We\u0026rsquo;ll need to edit our theme so I recommend first going through the steps in the \u003ca href=\"https://help.micro.blog/2019/about-themes/\"\u003ehelp.micro.blog\u003c/a\u003e section on custom themes.\u003c/p\u003e\n\u003ch3 id=\"css\"\u003eCSS\u003c/h3\u003e\n\u003cp\u003eAssuming you are using the Hello theme we now need to edit \u003ccode\u003elayouts/partials/head.html\u003c/code\u003e and include our CSS and the actually Glightbox JavaScript. This is relatively easy though, just follow the instructions on the Micro.blog help (Manton has a great \u003ca href=\"https://www.youtube.com/watch?v=MLUWnrMKVdg\"\u003eYouTube video\u003c/a\u003e which covers the basics).\u003c/p\u003e\n\u003cp\u003eOnce in the editor, we\u0026rsquo;ll want to add the following two lines:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#268bd2\"\u003elink\u003c/span\u003e rel\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;stylesheet\u0026#34;\u003c/span\u003e href\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;https://cdn.jsdelivr.net/npm/glightbox/dist/css/glightbox.min.css\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#268bd2\"\u003escript\u003c/span\u003e src\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;https://cdn.jsdelivr.net/gh/mcstudios/glightbox/dist/js/glightbox.min.js\u0026#34;\u003c/span\u003e\u0026gt;\u0026lt;/\u003cspan style=\"color:#268bd2\"\u003escript\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"javascript\"\u003eJavaScript\u003c/h3\u003e\n\u003cp\u003eSo far so good! I have a feeling the next part is going to be different with every theme, so it might not be as easy. When adding an image to a post through the micro.blog website it is simply included as an \u003ccode\u003e\u0026lt;img\u0026gt;\u003c/code\u003e tag. The last thing I want to do is have to go in and add all the tags to images as I post them.\u003c/p\u003e\n\u003cp\u003eWith that in mind I crafted a passible bit of JavaScript which will pull out any images that appear within post content and automatically link them so they will be shown in the lightbox.\u003c/p\u003e\n\u003cp\u003eNeat.\u003c/p\u003e\n\u003cp\u003eTo add the JavaScript we\u0026rsquo;ll again need to edit part of the theme. In this case we\u0026rsquo;ll want to open \u003ccode\u003estatic/assets/main.js\u003c/code\u003e for editing. Once open we can added the following JavaScript to the top. Feel free to take out the comments, I\u0026rsquo;ve just added them for this post.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// First we\u0026#39;ll grab all the images inside a post paragraph\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\u003cspan style=\"color:#268bd2\"\u003elet\u003c/span\u003e ims \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#b58900\"\u003edocument\u003c/span\u003e.querySelectorAll(\u003cspan style=\"color:#2aa198\"\u003e\u0026#39;.post-content p img\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// If ims === 0 lets not do anything\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e (ims.length \u003cspan style=\"color:#719e07\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#586e75\"\u003e// Now we\u0026#39;ll loop through all of the images that were picked up\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e  \u003cspan style=\"color:#586e75\"\u003e// Note that I\u0026#39;m doing no real error handling, you might want to clean this up\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e  \u003cspan style=\"color:#719e07\"\u003efor\u003c/span\u003e (\u003cspan style=\"color:#268bd2\"\u003elet\u003c/span\u003e i \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e; i \u003cspan style=\"color:#719e07\"\u003e\u0026lt;\u003c/span\u003e ims.length; i\u003cspan style=\"color:#719e07\"\u003e++\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#586e75\"\u003e// For each image we get the parent element, in this case it will be \u0026lt;p\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e    \u003cspan style=\"color:#268bd2\"\u003elet\u003c/span\u003e parentElm \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e ims[i].parentElement;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#586e75\"\u003e// Using the paraent element and the image object we replace the innerHTML\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e    \u003cspan style=\"color:#586e75\"\u003e// with our image with the class \u0026#34;glightbox\u0026#34; and a link to the image\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e    parentElm.innerHTML \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;\u0026lt;a href=\u0026#34;\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e ims[i].src \u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;\u0026#34;\u0026gt;\u0026lt;img src=\u0026#34;\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e ims[i].src \u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;\u0026#34; class=\u0026#34;glightbox\u0026#34;\u0026gt;\u0026lt;/a\u0026gt;\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// Finally we call GLightbox and if all went well...\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\u003cspan style=\"color:#268bd2\"\u003econst\u003c/span\u003e lightbox \u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e GLightbox({});\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cimg src=\"/imgs/lightbox-01.png\" alt=\"babby Yoda\"\u003e\u003c/p\u003e\n\u003ch2 id=\"caveats\"\u003eCaveats\u003c/h2\u003e\n\u003cp\u003e\u0026ldquo;This code works on my computer!\u0026rdquo; Hopefully, if everything went smoothly then the image above should be clickable and should appear in the lightbox. The JavaScript image selection code is likely extremely brittle and probably won\u0026rsquo;t work for many themes. There should be enough information here for others to follow. For best results you will probably want to keep to only one image per post (though it should work with more).\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"update\"\u003eUpdate\u003c/h2\u003e\n\u003cp\u003eAs \u003ca href=\"https://micro.json.blog/2019/12/30/223827.html\"\u003eJason Becker\u003c/a\u003e points out since we are using Hugo we can take advantage of \u003ca href=\"https://gohugo.io/content-management/shortcodes\"\u003ecustom shortcodes\u003c/a\u003e. Also as \u003ca href=\"https://micro.blog/bix/7502311\"\u003e@bix\u003c/a\u003e noted, the docs for Glightbox indicate that the class is added to the \u003ccode\u003e\u0026lt;a\u0026gt;\u003c/code\u003e anchor tag and not the image itself. It seems to work OK either way in my testing but if you are having an issue that could be why.\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n"
    },
    {
      "title": "Attempting to Learn Go - Issuer 04 - Addendum",
      "date_published": "2019-07-13T10:52:32-07:00",
      "date_modified": "2019-07-13T10:52:32-07:00",
      "id": "https://shindakun.dev/posts/attempting-to-learn-go-issuer-04-addendum/",
      "url": "https://shindakun.dev/posts/attempting-to-learn-go-issuer-04-addendum/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003ch2 id=\"whoops\"\u003eWhoops\u003c/h2\u003e\n\u003cp\u003eOur last Issuer post left out one small bit of code. Let\u0026rsquo;s fix that and wrap this up. Also, let\u0026rsquo;s cover how to test the webhook before moving to Google Cloud Functions.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"missed-if\"\u003eMissed \u003ccode\u003eif\u003c/code\u003e\u003c/h3\u003e\n\u003cp\u003eAs I \u003ca href=\"https://shindakun.dev/posts/attempting-to-learn-go-issuer-03-cloud-function-go/\"\u003epublished Issuer\u003c/a\u003e to Google Cloud Functions I meant to update the code. The idea is to only create new issues when the originating payload action was \u003ccode\u003eopened\u003c/code\u003e. The final revision of the post left that out though so here we go. Let\u0026rsquo;s look at our updated \u003ccode\u003eHandleWebhook()\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003eHandleWebhook\u003c/span\u003e(res http.ResponseWriter, req \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003ehttp.Request) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e Payload Payload\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003edefer\u003c/span\u003e req.Body.\u003cspan style=\"color:#268bd2\"\u003eClose\u003c/span\u003e()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  p, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e github.\u003cspan style=\"color:#268bd2\"\u003eValidatePayload\u003c/span\u003e(req, []\u003cspan style=\"color:#b58900\"\u003ebyte\u003c/span\u003e(Secret))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    http.\u003cspan style=\"color:#268bd2\"\u003eError\u003c/span\u003e(res, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;bad request: \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003eerr.\u003cspan style=\"color:#268bd2\"\u003eError\u003c/span\u003e(), \u003cspan style=\"color:#2aa198\"\u003e400\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;bad request: %v\u0026#34;\u003c/span\u003e, err.\u003cspan style=\"color:#268bd2\"\u003eError\u003c/span\u003e())\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  err = json.\u003cspan style=\"color:#268bd2\"\u003eUnmarshal\u003c/span\u003e(p, \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003ePayload)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    http.\u003cspan style=\"color:#268bd2\"\u003eError\u003c/span\u003e(res, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;bad request: \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003eerr.\u003cspan style=\"color:#268bd2\"\u003eError\u003c/span\u003e(), \u003cspan style=\"color:#2aa198\"\u003e400\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;bad request: %v\u0026#34;\u003c/span\u003e, err.\u003cspan style=\"color:#268bd2\"\u003eError\u003c/span\u003e())\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eHere we are - we check \u003ccode\u003ePayload.Action\u003c/code\u003e to ensure it\u0026rsquo;s \u003ccode\u003eopened\u003c/code\u003e and if so then we create out new issue.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e Payload.Action \u003cspan style=\"color:#719e07\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;opened\u0026#34;\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    err = \u003cspan style=\"color:#268bd2\"\u003ecreateNewIssue\u003c/span\u003e(\u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003ePayload)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;bad request: %v\u0026#34;\u003c/span\u003e, err.\u003cspan style=\"color:#268bd2\"\u003eError\u003c/span\u003e())\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"testing-webhooks\"\u003eTesting Webhooks\u003c/h2\u003e\n\u003cp\u003eBefore pushing to GCF it was necessary to test the webhooks to ensure I was receiving what I needed. This is actually pretty easy thanks to \u003ca href=\"https://ngrok.com/\"\u003e\u003ccode\u003engrok\u003c/code\u003e\u003c/a\u003e. \u003ccode\u003engrok\u003c/code\u003e is a command line tool which allows us to access our internal program from an external network. No need to worry about setting up your firewall or tunneling.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"ngrok\"\u003e\u003ccode\u003engrok\u003c/code\u003e\u003c/h3\u003e\n\u003cp\u003eTo do this we\u0026rsquo;ll need to make sure we have \u003ccode\u003engrok\u003c/code\u003e installed. On a Mac, which is where I tend to do most of my development lately, it\u0026rsquo;s a simple matter of installing via \u003ccode\u003ebrew\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebrew install ngrok\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIf you happen to be using Windows, you can download from the \u003ccode\u003engrok\u003c/code\u003e website, \u003ca href=\"https://ngrok.com/download\"\u003ehttps://ngrok.com/download\u003c/a\u003e. Follow the instructions to install on the website. Once installed you should be able to open a command prompt or terminal window and run \u003ccode\u003engrok\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e➜  ~ ngrok\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eNAME:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   ngrok - tunnel \u003cspan style=\"color:#b58900\"\u003elocal\u003c/span\u003e ports to public URLs and inspect traffic\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDESCRIPTION:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    ngrok exposes \u003cspan style=\"color:#b58900\"\u003elocal\u003c/span\u003e networked services behinds NATs and firewalls to the\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    public internet over a secure tunnel. Share \u003cspan style=\"color:#b58900\"\u003elocal\u003c/span\u003e websites, build/test\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    webhook consumers and self-host personal services.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Detailed \u003cspan style=\"color:#b58900\"\u003ehelp\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003efor\u003c/span\u003e each \u003cspan style=\"color:#b58900\"\u003ecommand\u003c/span\u003e is available with \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;ngrok help \u0026lt;command\u0026gt;\u0026#39;\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Open http://localhost:4040 \u003cspan style=\"color:#719e07\"\u003efor\u003c/span\u003e ngrok\u0026#39;s web interface to inspect traffic.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e...\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch3 id=\"now-what\"\u003eNow What\u003c/h3\u003e\n\u003cp\u003eNow what? That\u0026rsquo;s easy! Let\u0026rsquo;s run\u0026hellip;\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003engrok http \u003cspan style=\"color:#2aa198\"\u003e3000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAssuming you are running the code we wrote last time, that runs on port 3000. Now open a new terminal window and lets run our code.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ego run main.go\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNow we\u0026rsquo;re up and running, lets enable some webhooks on GitHub and do some actual testing.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"github-webhooks\"\u003eGitHub Webhooks\u003c/h3\u003e\n\u003cp\u003eWith both \u003ccode\u003engrok\u003c/code\u003e and our code running we go to GitHub! Pick a repo, or create a test one. Under the settings tab, chose \u0026ldquo;Webhooks\u0026rdquo; on the left. Click \u0026ldquo;Add webhook\u0026rdquo; on the upper right. Enter our \u003ccode\u003engrok\u003c/code\u003e URL, ex: \u003ccode\u003ehttps://9ba7d0f6.ngrok.io\u003c/code\u003e and add \u003ccode\u003e/webhook\u003c/code\u003e. In \u0026ldquo;Content type\u0026rdquo; make sure you select \u003ccode\u003eapplication/json\u003c/code\u003e. For this project I chose \u0026ldquo;Let me select individual events\u0026rdquo; and then selected only \u0026ldquo;Issues\u0026rdquo;. Then click \u0026ldquo;Add webhook\u0026rdquo; at the bottom.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/imgs/webhook-01.png\" alt=\"ngrok running on the command line\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/imgs/webhook-02.png\" alt=\"github webhook settings\"\u003e\u003c/p\u003e\n\u003cp\u003eGitHub will send off a test post, we should see something right away.\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/imgs/webhook-03.png\" alt=\"running issuer\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"/imgs/webhook-04.png\" alt=\"test webhook\"\u003e\u003c/p\u003e\n\u003cp\u003eAnd there we have it! It\u0026rsquo;s mostly blank because it\u0026rsquo;s just a test but it\u0026rsquo;s enough to show that we\u0026rsquo;re working as expected.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eYou can find the code for this and most of the other Attempting to Learn Go posts in the repo on GitHub.\u003c/p\u003e\n\u003cp\u003e{% github shindakun/atlg %}\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n"
    },
    {
      "title": "Attempting to Learn Go - Issuer 03 - Cloud Function Go!",
      "date_published": "2019-06-22T16:39:49-07:00",
      "date_modified": "2019-06-22T16:39:49-07:00",
      "id": "https://shindakun.dev/posts/attempting-to-learn-go-issuer-03-cloud-function-go/",
      "url": "https://shindakun.dev/posts/attempting-to-learn-go-issuer-03-cloud-function-go/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003ch1 id=\"functioning-in-the-cloud\"\u003eFunctioning In The Cloud\u003c/h1\u003e\n\u003cp\u003eWelcome back! We are just done with our GitHub TODO issue creator thing. This time around we\u0026rsquo;re going to go through the steps to deploy it as a Google Cloud Function. To do this we\u0026rsquo;ll need to alter the code. But before we dive into the code itself we\u0026rsquo;ll need to get setup to use Go modules.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"go-mod\"\u003eGo Mod\u003c/h2\u003e\n\u003cp\u003eFirst, we\u0026rsquo;ll need to get our \u003ccode\u003emod\u003c/code\u003e file ready. You may or may not already have modules enabled. If you do you should be able to leave off the \u003ccode\u003eGO111MODULE=on\u003c/code\u003e part of the command.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003eGO111MODULE\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003eon go mod issuer\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNow, we need to make sure we\u0026rsquo;ve got all the modules we need.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e➜  issuer \u003cspan style=\"color:#268bd2\"\u003eGO111MODULE\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003eon go mod tidy\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ego: finding github.com/google/go-github/v25/github latest\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ego: finding golang.org/x/oauth2 latest\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ego: downloading google.golang.org/appengine v1.4.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ego: extracting google.golang.org/appengine v1.4.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ego: downloading github.com/golang/protobuf v1.2.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ego: extracting github.com/golang/protobuf v1.2.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ego: downloading golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ego: extracting golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLooking good so far! Next we want to vendor our dependancies. This copies the modules we downloaded in the previous step into our code directory.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003eGO111MODULE\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003eon go mod vendor\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWe should now see the vendor directory.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e➜  issuer ls\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ego.mod  go.sum  main.go vendor\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch3 id=\"alterations\"\u003eAlterations\u003c/h3\u003e\n\u003cp\u003eNow let\u0026rsquo;s make a few changes to our code to get it ready for deploying as a Cloud Function. We\u0026rsquo;ll be starting off the same as last time. You may notice that I\u0026rsquo;ve removed the ability to query \u003ccode\u003e/status\u003c/code\u003e, it is not longer needed.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003epackage\u003c/span\u003e issuer\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003eimport\u003c/span\u003e (\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;context\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;encoding/json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;fmt\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;log\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;net/http\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;os\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;strconv\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;github.com/google/go-github/v25/github\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;github.com/shindakun/envy\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;golang.org/x/oauth2\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNote that I\u0026rsquo;ve pulled out our constants and replaced them will variables. This allows us to make the code a bit more generic and so others can use it. We\u0026rsquo;ll cover how we are setting up these variables a bit later on. Note, some people may not like the use of global variables here. Since our function is so small and we have a good idea what\u0026rsquo;s happening in each step it\u0026rsquo;s OK to use them for now.\u003c/p\u003e\n\u003cp\u003eOf course if you\u0026rsquo;d rather not have globals feel free to remove them. You can hard code as constants or load them inside our main function call.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// RepoOwner is the owner of the repo we want to open an issue in\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e RepoOwner \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// IssueRepo is the repo we want to open this new issue in\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e IssueRepo \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// ProjectColumn is the TODO column number of the project we want to add the issue to\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e ProjectColumn \u003cspan style=\"color:#dc322f\"\u003eint64\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// Token is the GitHub Personal Access Token\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e Token \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// Secret is used to validate payloads\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e Secret \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// Payload of GitHub webhook\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\u003cspan style=\"color:#268bd2\"\u003etype\u003c/span\u003e Payload \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Action \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;action\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Issue  \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    URL           \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;url\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    RepositoryURL \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;repository_url\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Number        \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;number\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Title         \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Body          \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;body\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  } \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;issue\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Repository \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Name \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;name\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  } \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;repository\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eI\u0026rsquo;ve also changed \u003ccode\u003ehandleWebhook()\u003c/code\u003e to \u003ccode\u003eHandleWebhook()\u003c/code\u003e. Exporting the function is what allows us to call it as the cloud function.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003eHandleWebhook\u003c/span\u003e(res http.ResponseWriter, req \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003ehttp.Request) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e Payload Payload\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003edefer\u003c/span\u003e req.Body.\u003cspan style=\"color:#268bd2\"\u003eClose\u003c/span\u003e()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  p, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e github.\u003cspan style=\"color:#268bd2\"\u003eValidatePayload\u003c/span\u003e(req, []\u003cspan style=\"color:#b58900\"\u003ebyte\u003c/span\u003e(Secret))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    http.\u003cspan style=\"color:#268bd2\"\u003eError\u003c/span\u003e(res, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;bad request: \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003eerr.\u003cspan style=\"color:#268bd2\"\u003eError\u003c/span\u003e(), \u003cspan style=\"color:#2aa198\"\u003e400\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;bad request: %v\u0026#34;\u003c/span\u003e, err.\u003cspan style=\"color:#268bd2\"\u003eError\u003c/span\u003e())\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAs @kunde21 pointed out last week we are better off using \u003ccode\u003ejson.Unmarshal()\u003c/code\u003e here. This also allows us to remove the imports for \u003ccode\u003ebytes\u003c/code\u003e and \u003ccode\u003eio/ioutil\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  err = json.\u003cspan style=\"color:#268bd2\"\u003eUnmarshal\u003c/span\u003e(p, \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003ePayload)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    http.\u003cspan style=\"color:#268bd2\"\u003eError\u003c/span\u003e(res, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;bad request: \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003eerr.\u003cspan style=\"color:#268bd2\"\u003eError\u003c/span\u003e(), \u003cspan style=\"color:#2aa198\"\u003e400\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;bad request: %v\u0026#34;\u003c/span\u003e, err.\u003cspan style=\"color:#268bd2\"\u003eError\u003c/span\u003e())\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  err = \u003cspan style=\"color:#268bd2\"\u003ecreateNewIssue\u003c/span\u003e(\u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003ePayload)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;bad request: %v\u0026#34;\u003c/span\u003e, err.\u003cspan style=\"color:#268bd2\"\u003eError\u003c/span\u003e())\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003ecreateNewIssue\u003c/span\u003e(p \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003ePayload) \u003cspan style=\"color:#dc322f\"\u003eerror\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;Creating New Issue.\\n\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;  Name: %#v\\n\u0026#34;\u003c/span\u003e, p.Repository.Name)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;  Title: %#v\\n\u0026#34;\u003c/span\u003e, p.Issue.Title)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;  Body: %#v\\n\u0026#34;\u003c/span\u003e, p.Issue.Body)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;  URL: %#v\\n\u0026#34;\u003c/span\u003e, p.Issue.URL)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  ctx \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e context.\u003cspan style=\"color:#268bd2\"\u003eBackground\u003c/span\u003e()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  ts \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e oauth2.\u003cspan style=\"color:#268bd2\"\u003eStaticTokenSource\u003c/span\u003e(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003eoauth2.Token{AccessToken: Token},\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  )\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  tc \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e oauth2.\u003cspan style=\"color:#268bd2\"\u003eNewClient\u003c/span\u003e(ctx, ts)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  client \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e github.\u003cspan style=\"color:#268bd2\"\u003eNewClient\u003c/span\u003e(tc)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  title \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e fmt.\u003cspan style=\"color:#268bd2\"\u003eSprintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;[%s] %s\u0026#34;\u003c/span\u003e, p.Repository.Name, p.Issue.Title)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  body \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e fmt.\u003cspan style=\"color:#268bd2\"\u003eSprintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;%s\\n%s/%s#%d\u0026#34;\u003c/span\u003e, p.Issue.Body, RepoOwner, p.Repository.Name, p.Issue.Number)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  issue \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003egithub.IssueRequest{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Title: \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003etitle,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Body:  \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003ebody,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  ish, _, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e client.Issues.\u003cspan style=\"color:#268bd2\"\u003eCreate\u003c/span\u003e(ctx, RepoOwner, IssueRepo, issue)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;error: %v\u0026#34;\u003c/span\u003e, err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e err\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  id \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003eish.ID\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  card \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003egithub.ProjectCardOptions{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    ContentID:   id,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    ContentType: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;Issue\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  _, _, err = client.Projects.\u003cspan style=\"color:#268bd2\"\u003eCreateProjectCard\u003c/span\u003e(ctx, ProjectColumn, card)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;error: %v\u0026#34;\u003c/span\u003e, err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e err\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNow we get to one of the biggest changes. Since the cloud function is going to call \u003ccode\u003eHandleWebhook()\u003c/code\u003e, we no longer need our \u003ccode\u003emain()\u003c/code\u003e. But that presents an issue, we have some environment variables we want to use. We could load them in the \u003ccode\u003eHandleWebhook()\u003c/code\u003e call it\u0026rsquo;s more appropriate to make use of \u003ca href=\"https://golang.org/doc/effective_go.html#init\"\u003eGo\u0026rsquo;s \u003ccode\u003einit()\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003einit()\u003c/code\u003e runs before main (or our handler in this case), which allows us to load our variables as normal.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003einit\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  log.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;Issuer\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e err \u003cspan style=\"color:#dc322f\"\u003eerror\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Token, err = envy.\u003cspan style=\"color:#268bd2\"\u003eGet\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;GITHUBTOKEN\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e||\u003c/span\u003e Token \u003cspan style=\"color:#719e07\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;error: %v\u0026#34;\u003c/span\u003e, err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    os.\u003cspan style=\"color:#268bd2\"\u003eExit\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Secret, err = envy.\u003cspan style=\"color:#268bd2\"\u003eGet\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;SECRET\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e||\u003c/span\u003e Secret \u003cspan style=\"color:#719e07\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;error: %v\u0026#34;\u003c/span\u003e, err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    os.\u003cspan style=\"color:#268bd2\"\u003eExit\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  RepoOwner, err = envy.\u003cspan style=\"color:#268bd2\"\u003eGet\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;REPOOWNER\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e||\u003c/span\u003e RepoOwner \u003cspan style=\"color:#719e07\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;error: %v\u0026#34;\u003c/span\u003e, err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    os.\u003cspan style=\"color:#268bd2\"\u003eExit\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  IssueRepo, err = envy.\u003cspan style=\"color:#268bd2\"\u003eGet\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;ISSUEREPO\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e||\u003c/span\u003e IssueRepo \u003cspan style=\"color:#719e07\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;error: %v\u0026#34;\u003c/span\u003e, err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    os.\u003cspan style=\"color:#268bd2\"\u003eExit\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003eProjectColumn\u003c/code\u003e requires a bit more setting up since I never extended \u003ccode\u003eenvy\u003c/code\u003e to return \u003ccode\u003eint\u003c/code\u003es. So we need to convert to an \u003ccode\u003eint64\u003c/code\u003e before we can use the column numeric ID to create our TODO card on the kanban board.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  n, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e envy.\u003cspan style=\"color:#268bd2\"\u003eGet\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;PROJECTCOLUMN\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e||\u003c/span\u003e n \u003cspan style=\"color:#719e07\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;error: %v\u0026#34;\u003c/span\u003e, err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    os.\u003cspan style=\"color:#268bd2\"\u003eExit\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    ProjectColumn, err = strconv.\u003cspan style=\"color:#268bd2\"\u003eParseInt\u003c/span\u003e(n, \u003cspan style=\"color:#2aa198\"\u003e10\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e64\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e||\u003c/span\u003e ProjectColumn \u003cspan style=\"color:#719e07\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e0\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;error: %v\u0026#34;\u003c/span\u003e, err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    os.\u003cspan style=\"color:#268bd2\"\u003eExit\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"go-to-the-cloud\"\u003eGo To The Cloud\u003c/h2\u003e\n\u003cp\u003eI am going to assume that you have the Google Cloud command line tools installed and a project set up. If you do not Google has some very good tutorials. Checkout \u003ca href=\"https://cloud.google.com/functions/docs/quickstart\"\u003ehttps://cloud.google.com/functions/docs/quickstart\u003c/a\u003e for more\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNote: You wouldn\u0026rsquo;t want to have the secret and the token deployed like this in production. You would instead want to use \u003ca href=\"https://cloud.google.com/kms/docs/secret-management\"\u003eCloud KMS\u003c/a\u003e or \u003ca href=\"https://cloud.google.com/deployment-manager/runtime-configurator/\"\u003eRuntime Configurator\u003c/a\u003e. I\u0026rsquo;m living dangerously.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e➜  issuer gcloud functions deploy issuer --entry-point HandleWebhook --runtime go111 --trigger-http --memory\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e128MB --set-env-vars \u003cspan style=\"color:#268bd2\"\u003eSECRET\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003esecret,GITHUBTOKEN\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003etoken,REPOOWNER\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003eshindakun,ISSUEREPO\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003eto,PROJECTCOLUMN\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e5647145\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDeploying \u003cspan style=\"color:#719e07\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e(\u003c/span\u003emay take a \u003cspan style=\"color:#719e07\"\u003ewhile\u003c/span\u003e - up to \u003cspan style=\"color:#2aa198\"\u003e2\u003c/span\u003e minutes\u003cspan style=\"color:#719e07\"\u003e)\u003c/span\u003e...done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eavailableMemoryMb: \u003cspan style=\"color:#2aa198\"\u003e128\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eentryPoint: HandleWebhook\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eenvironmentVariables:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  GITHUBTOKEN: token\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  ISSUEREPO: to\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  PROJECTCOLUMN: \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;5647145\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  REPOOWNER: shindakun\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  SECRET: secret\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehttpsTrigger:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  url: https://us-east1-golang-slackbot.cloudfunctions.net/issuer\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elabels:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  deployment-tool: cli-gcloud\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ename: projects/golang-slackbot/locations/us-east1/functions/issuer\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eruntime: go111\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eserviceAccountEmail: golang-slackbot@appspot.gserviceaccount.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esourceUploadUrl: https://storage.googleapis.com/gcf-upload-us-central1-eeb5af0e-fd09-4fe7-30851592ebba/bcc11c6f-55fc-4d73-864a-6a89813206a6.zip?GoogleAccessId\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003eservice-84452958925@gcf-gserviceaccount.com\u0026amp;\u003cspan style=\"color:#268bd2\"\u003eExpires\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e1561244032\u0026amp;\u003cspan style=\"color:#268bd2\"\u003eSignature\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003eQX%2BKy5j6YTA6%D%3D\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003estatus: ACTIVE\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etimeout: 60s\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eupdateTime: \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;2019-06-22T22:24:37Z\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eversionId: \u003cspan style=\"color:#2aa198\"\u003e\u0026#39;1\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"next-time\"\u003eNext time\u003c/h2\u003e\n\u003cp\u003eAnd there we have it! We\u0026rsquo;re now live and update any source repos to use our trigger URL. That makes this stage of our issuer complete. New issues will appear in our target repo and on the TODO section of the kanban board!\u003c/p\u003e\n\u003cp\u003eWhat should we tackle next time? I\u0026rsquo;ll have to take a look at the kanban board and see if any ideas jump out at me. Until then feel free to let me know if you spot something to refactor.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eYou can find the code for this and most of the other Attempting to Learn Go posts in the repo on GitHub.\u003c/p\u003e\n\u003cp\u003e{% github shindakun/atlg %}\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n"
    },
    {
      "title": "Attempting to Learn Go - Issuer 02",
      "date_published": "2019-06-15T12:12:44-07:00",
      "date_modified": "2019-06-15T12:12:44-07:00",
      "id": "https://shindakun.dev/posts/attempting-to-learn-go-issuer-02/",
      "url": "https://shindakun.dev/posts/attempting-to-learn-go-issuer-02/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003ch1 id=\"github-issuer\"\u003eGitHub Issuer\u003c/h1\u003e\n\u003cp\u003eWelcome back! Though if you haven\u0026rsquo;t read the first part, you may want to. We\u0026rsquo;re expanding on the code that we write last time. Adding in the ability to actually create new issues in our TODO repository and add them to the kanban board. Yes the most over-engineered TODO \u0026ldquo;system\u0026rdquo; is going to get an upgrade. With that out of the way lets get right into it.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"lets-go\"\u003eLets Go\u003c/h2\u003e\n\u003cp\u003eOur imports have expanded as we\u0026rsquo;re pulling in a bunch of bits from the standard library and a few external packages. The \u003ccode\u003ego-github\u003c/code\u003e package is going to do a quite a bit of heavy lifting for us. \u003ccode\u003eoauth2\u003c/code\u003e is coming along for the ride so we can use a GitHub personal access token to authorize our requests.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003epackage\u003c/span\u003e main\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003eimport\u003c/span\u003e (\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;bytes\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;context\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;encoding/json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;fmt\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;io/ioutil\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;log\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;net/http\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;os\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;github.com/google/go-github/v25/github\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;github.com/shindakun/envy\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;golang.org/x/oauth2\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCurrently, we\u0026rsquo;re setting a few constants. We may bring theses up out of the code and make them environment variables in the \u0026ldquo;production\u0026rdquo; version. For local testing though it\u0026rsquo;s probably fine. The token however, is already set as an environment variable, which should keep me from accidentally committing it to GitHub. It\u0026rsquo;s good practice to keep tokens out of the code whenever possible.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003econst\u003c/span\u003e (\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#586e75\"\u003e// RepoOwner is the owner of the repo we want to open an issue in\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e  RepoOwner = \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;shindakun\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#586e75\"\u003e// IssueRepo is the repo we want to open this new issue in.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e  IssueRepo = \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;to\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#586e75\"\u003e// ProjectColumn is the TODO column number of the project we want to add the issue to\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e  ProjectColumn = \u003cspan style=\"color:#2aa198\"\u003e5647145\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// Token is the GitHub Personal Access Token\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e Token \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// Secret is used to validate webhook payloads\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e Secret \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOur \u003ccode\u003ePayload\u003c/code\u003e is pretty much set, we don\u0026rsquo;t need anything else from the responses for now. Our \u003ccode\u003estatus\u003c/code\u003e handler will remain the same as well.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e// Payload of GitHub webhook\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#586e75\"\u003e\u003c/span\u003e\u003cspan style=\"color:#268bd2\"\u003etype\u003c/span\u003e Payload \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Action \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;action\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Issue  \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    URL           \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;url\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    RepositoryURL \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;repository_url\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Number        \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;number\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Title         \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Body          \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;body\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  } \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;issue\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Repository \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Name \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;name\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  } \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;repository\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003estatus\u003c/span\u003e(res http.ResponseWriter, req \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003ehttp.Request) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  fmt.\u003cspan style=\"color:#268bd2\"\u003eFprintf\u003c/span\u003e(res, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;Hello!\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThe webhook handler starts off the same. But quickly deviates.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003ehandleWebhook\u003c/span\u003e(res http.ResponseWriter, req \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003ehttp.Request) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e Payload Payload\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003edefer\u003c/span\u003e req.Body.\u003cspan style=\"color:#268bd2\"\u003eClose\u003c/span\u003e()\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWe take our incoming request and pass it and our \u003ccode\u003eSecret\u003c/code\u003e into \u003ccode\u003egithub.ValidatePayload()\u003c/code\u003e. The \u003ccode\u003eX-Hub-Signature\u003c/code\u003e on the incoming request comes with a signature compare against our calculated signature. If it matches we\u0026rsquo;re good to go.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe HMAC hex digest of the response body. This header will be sent if the webhook is configured with a secret. The HMAC hex digest is generated using the sha1 hash function and the secret as the HMAC key.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThis protects us from some one accidentally finding our endpoint and submitting requests. Sure the chances are low but why take chances. If the request doesn\u0026rsquo;t pass validation we simply return and carry on.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  p, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e github.\u003cspan style=\"color:#268bd2\"\u003eValidatePayload\u003c/span\u003e(req, []\u003cspan style=\"color:#b58900\"\u003ebyte\u003c/span\u003e(Secret))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    http.\u003cspan style=\"color:#268bd2\"\u003eError\u003c/span\u003e(res, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;bad request: \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003eerr.\u003cspan style=\"color:#268bd2\"\u003eError\u003c/span\u003e(), \u003cspan style=\"color:#2aa198\"\u003e400\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;bad request: %v\u0026#34;\u003c/span\u003e, err.\u003cspan style=\"color:#268bd2\"\u003eError\u003c/span\u003e())\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003egithub.ValidatePayload()\u003c/code\u003e returns a \u003ccode\u003e[]byte\u003c/code\u003e of the payload which we need to wrap in a \u0026ldquo;ReadCloser\u0026rdquo; which we can then pass to \u003ccode\u003ejsonNewDecoder()\u003c/code\u003e so we can parse the JSON object as our final \u003ccode\u003ePayload\u003c/code\u003e. Again, if anything goes wrong we\u0026rsquo;ll log the error and return. If all goes well, we pass our \u003ccode\u003ePayload\u003c/code\u003e to \u003ccode\u003ecreateNewIssue()\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  decoder \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e json.\u003cspan style=\"color:#268bd2\"\u003eNewDecoder\u003c/span\u003e(ioutil.\u003cspan style=\"color:#268bd2\"\u003eNopCloser\u003c/span\u003e(bytes.\u003cspan style=\"color:#268bd2\"\u003eNewBuffer\u003c/span\u003e(p)))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  err = decoder.\u003cspan style=\"color:#268bd2\"\u003eDecode\u003c/span\u003e(\u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003ePayload)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    http.\u003cspan style=\"color:#268bd2\"\u003eError\u003c/span\u003e(res, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;bad request: \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003eerr.\u003cspan style=\"color:#268bd2\"\u003eError\u003c/span\u003e(), \u003cspan style=\"color:#2aa198\"\u003e400\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;bad request: %v\u0026#34;\u003c/span\u003e, err.\u003cspan style=\"color:#268bd2\"\u003eError\u003c/span\u003e())\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  err = \u003cspan style=\"color:#268bd2\"\u003ecreateNewIssue\u003c/span\u003e(\u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003ePayload)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;bad request: %v\u0026#34;\u003c/span\u003e, err.\u003cspan style=\"color:#268bd2\"\u003eError\u003c/span\u003e())\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003ecreateNewIssue()\u003c/code\u003e first starts by logging out the details of our payload. This is just for testing purposes and will be removed I think.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003ecreateNewIssue\u003c/span\u003e(p \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003ePayload) \u003cspan style=\"color:#dc322f\"\u003eerror\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;Creating New Issue.\\n\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;  Name: %#v\\n\u0026#34;\u003c/span\u003e, p.Repository.Name)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;  Title: %#v\\n\u0026#34;\u003c/span\u003e, p.Issue.Title)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;  Body: %#v\\n\u0026#34;\u003c/span\u003e, p.Issue.Body)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;  URL: %#v\\n\u0026#34;\u003c/span\u003e, p.Issue.URL)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFirst things first, we\u0026rsquo;ll get our oauth2 and GitHub client ready to go. This is as recommended by the \u003ca href=\"https://github.com/google/go-github\"\u003e\u003ccode\u003ego-github\u003c/code\u003e\u003c/a\u003e repo.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  ctx \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e context.\u003cspan style=\"color:#268bd2\"\u003eBackground\u003c/span\u003e()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  ts \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e oauth2.\u003cspan style=\"color:#268bd2\"\u003eStaticTokenSource\u003c/span\u003e(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003eoauth2.Token{AccessToken: Token},\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  )\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  tc \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e oauth2.\u003cspan style=\"color:#268bd2\"\u003eNewClient\u003c/span\u003e(ctx, ts)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  client \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e github.\u003cspan style=\"color:#268bd2\"\u003eNewClient\u003c/span\u003e(tc)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNow it\u0026rsquo;s time to build our new issue. I wanted the title to reflect which repo it was coming from.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[From repo] Remember to write a post\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eThe body of the repo holds whatever was originally entered and a link back to the source repo. We then pack the title and body into \u003ccode\u003egithub.IssueRequest\u003c/code\u003e and create the new issue!\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  title \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e fmt.\u003cspan style=\"color:#268bd2\"\u003eSprintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;[%s] %s\u0026#34;\u003c/span\u003e, p.Repository.Name, p.Issue.Title)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  body \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e fmt.\u003cspan style=\"color:#268bd2\"\u003eSprintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;%s\\n%s/%s#%d\u0026#34;\u003c/span\u003e, p.Issue.Body, RepoOwner, p.Repository.Name, p.Issue.Number)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  issue \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003egithub.IssueRequest{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Title: \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003etitle,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Body:  \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003ebody,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  ish, _, err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e client.Issues.\u003cspan style=\"color:#268bd2\"\u003eCreate\u003c/span\u003e(ctx, RepoOwner, IssueRepo, issue)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;error: %v\u0026#34;\u003c/span\u003e, err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e err\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWe are not quite done though. I want to make sure the new issue is added to the TODO kanban board. So we take the details from the new issue, extract the issue ID number and setup a new \u0026ldquo;card\u0026rdquo; with \u003ccode\u003egithub.ProjectCardOptions\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  id \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003eish.ID\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  card \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003egithub.ProjectCardOptions{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    ContentID:   id,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    ContentType: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;Issue\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWe aren\u0026rsquo;t to concerned with the details return from this call so we just check for an error and return if need be.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  _, _, err = client.Projects.\u003cspan style=\"color:#268bd2\"\u003eCreateProjectCard\u003c/span\u003e(ctx, ProjectColumn, card)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;error: %v\u0026#34;\u003c/span\u003e, err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e err\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAnd that brings us to our updated \u003ccode\u003emain()\u003c/code\u003e. We\u0026rsquo;ve added a bit of code to grab our environment variables and if not set we\u0026rsquo;ll bail out with an error.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003emain\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  log.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;Issuer\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e err \u003cspan style=\"color:#dc322f\"\u003eerror\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Token, err = envy.\u003cspan style=\"color:#268bd2\"\u003eGet\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;GITHUBTOKEN\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e||\u003c/span\u003e Token \u003cspan style=\"color:#719e07\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;error: %v\u0026#34;\u003c/span\u003e, err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    os.\u003cspan style=\"color:#268bd2\"\u003eExit\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Secret, err = envy.\u003cspan style=\"color:#268bd2\"\u003eGet\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;SECRET\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e \u003cspan style=\"color:#719e07\"\u003e||\u003c/span\u003e Secret \u003cspan style=\"color:#719e07\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;error: %v\u0026#34;\u003c/span\u003e, err)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    os.\u003cspan style=\"color:#268bd2\"\u003eExit\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e1\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  http.\u003cspan style=\"color:#268bd2\"\u003eHandleFunc\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;/\u0026#34;\u003c/span\u003e, status)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  http.\u003cspan style=\"color:#268bd2\"\u003eHandleFunc\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;/webhook\u0026#34;\u003c/span\u003e, handleWebhook)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  http.\u003cspan style=\"color:#268bd2\"\u003eListenAndServe\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;:3000\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"running\"\u003eRunning\u003c/h2\u003e\n\u003cp\u003eAlright lets run it and make a new issue in our test \u0026ldquo;from\u0026rdquo; repo.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003eSECRET\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003eTESTSECRET \u003cspan style=\"color:#268bd2\"\u003eGITHUBTOKEN\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#2aa198\"\u003e1234567890\u003c/span\u003e go run main.go\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e2019/06/15 11:23:32 Issuer\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e2019/06/15 11:24:42 Creating New Issue.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e2019/06/15 11:24:42   Name: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;from\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e2019/06/15 11:24:42   Title: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;asdfasdf\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e2019/06/15 11:24:42   Body: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;asdfasdfasdfasdfasdf\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e2019/06/15 11:24:42   URL: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;https://api.github.com/repos/shindakun/from/issues/13\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePerfect! Now all we need to do is throw it on a box and point our GitHub repos webhook settings at the proper URL.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"next-time\"\u003eNext time\u003c/h2\u003e\n\u003cp\u003eThat went pretty smooth! Next time I think we\u0026rsquo;ll convert this into something we can deploy on Google Cloud Functions! Which will make it much easier to deploy.\u003c/p\u003e\n\u003cp\u003eQuestions and comments are welcome!\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eYou can find the code for this and most of the other Attempting to Learn Go posts in the repo on GitHub.\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n"
    },
    {
      "title": "Attempting to Learn Go - Issuer 01",
      "date_published": "2019-06-08T10:49:37-07:00",
      "date_modified": "2019-06-08T10:49:37-07:00",
      "id": "https://shindakun.dev/posts/attempting_to_learn_go_-_issuer-01/",
      "url": "https://shindakun.dev/posts/attempting_to_learn_go_-_issuer-01/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003ch1 id=\"github-issuer\"\u003eGitHub Issuer\u003c/h1\u003e\n\u003cp\u003eIf you didn\u0026rsquo;t happen to \u003ca href=\"https://shindakun.dev/posts/working-on-a-new-flow/\"\u003eread the last post\u003c/a\u003e I\u0026rsquo;ll give you a brief overview. I\u0026rsquo;m trying out a new system to tackle my project load and my TODO list.\u003c/p\u003e\n\u003cp\u003eThe problem is that the current setup is very manual. Each \u0026ldquo;thing\u0026rdquo;, or project, I want to do gets its own repository with its own automated kanban board. I open an issue in the repo, assign it to the project board and \u0026ldquo;bam\u0026rdquo;, new task. But, I then need to add that issue to my master \u0026ldquo;TODO\u0026rdquo; repo by hand.\u003c/p\u003e\n\u003cp\u003eWe can\u0026rsquo;t have that! It makes the system more work than it should be. That means we won\u0026rsquo;t use it.\u003c/p\u003e\n\u003cp\u003eBut, we have a solution! GitHub repositories can have webhooks enabled. So, on every new issue, a POST request with the issue details goes to our webhook. That\u0026rsquo;s where \u003ccode\u003eIssuer\u003c/code\u003e is going to come in. It will live on a server waiting for incoming POST events. Once one comes it will use the GitHub API to create an issue in the TODO repo.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"lets-go\"\u003eLets Go\u003c/h2\u003e\n\u003cp\u003eOK! Let\u0026rsquo;s jump right in and see what we are dealing with. If you read the second or third articles in the \u003ccode\u003eUploader\u003c/code\u003e series then parts of the base code will look similar. We\u0026rsquo;re using a very standard approach to a Go web server.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003epackage\u003c/span\u003e main\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003eimport\u003c/span\u003e (\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;encoding/json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;fmt\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;log\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;net/http\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThe GitHub issue payload is \u0026ldquo;massive\u0026rdquo; compared to what we actually need from it. So our \u003ccode\u003ePayload\u003c/code\u003e struct is only going to include exactly what we need to create a new issue.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003etype\u003c/span\u003e Payload \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Action \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;action\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Issue  \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    URL           \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;url\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    RepositoryURL \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;repository_url\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Number        \u003cspan style=\"color:#dc322f\"\u003eint\u003c/span\u003e    \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;number\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Title         \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;title\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Body          \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;body\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  } \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;issue\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Repository \u003cspan style=\"color:#268bd2\"\u003estruct\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Name     \u003cspan style=\"color:#dc322f\"\u003estring\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;name\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  } \u003cspan style=\"color:#2aa198\"\u003e`json:\u0026#34;repository\u0026#34;`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eHello! This isn\u0026rsquo;t needed but I like to have it as a small health check. In a more robust application you may want to return some sort of metrics from the server. Then if I wanted I could point Uptime Robot at \u003ccode\u003e/\u003c/code\u003e to alert if its down.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003estatus\u003c/span\u003e(res http.ResponseWriter, req \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003ehttp.Request) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  fmt.\u003cspan style=\"color:#268bd2\"\u003eFprintf\u003c/span\u003e(res, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;Hello!\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eI\u0026rsquo;ll cover how to enable webhooks in a repo and how we can test a bit later on. For now, let\u0026rsquo;s take a closer look at our webhook handler function. We begin by setting up our \u003ccode\u003ePayload\u003c/code\u003e variable and \u003ccode\u003edefer\u003c/code\u003e closing the request body. We then use \u003ccode\u003ejson.NewDecoder()\u003c/code\u003e to get ready and decode our JSON payload. If \u003ccode\u003edecode.Decoder()\u003c/code\u003e returns an error we\u0026rsquo;ll first return a \u003ccode\u003e400\u003c/code\u003e to the originating server. We then log out the error to the console and then return from the function.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003ehandleWebhook\u003c/span\u003e(res http.ResponseWriter, req \u003cspan style=\"color:#719e07\"\u003e*\u003c/span\u003ehttp.Request) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003evar\u003c/span\u003e Payload Payload\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003edefer\u003c/span\u003e req.Body.\u003cspan style=\"color:#268bd2\"\u003eClose\u003c/span\u003e()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  decoder \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e json.\u003cspan style=\"color:#268bd2\"\u003eNewDecoder\u003c/span\u003e(req.Body)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  err \u003cspan style=\"color:#719e07\"\u003e:=\u003c/span\u003e decoder.\u003cspan style=\"color:#268bd2\"\u003eDecode\u003c/span\u003e(\u003cspan style=\"color:#719e07\"\u003e\u0026amp;\u003c/span\u003ePayload)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#719e07\"\u003eif\u003c/span\u003e err \u003cspan style=\"color:#719e07\"\u003e!=\u003c/span\u003e \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    http.\u003cspan style=\"color:#268bd2\"\u003eError\u003c/span\u003e(res, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;bad request: \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e+\u003c/span\u003eerr.\u003cspan style=\"color:#268bd2\"\u003eError\u003c/span\u003e(), \u003cspan style=\"color:#2aa198\"\u003e400\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;bad request: %v\u0026#34;\u003c/span\u003e, err.\u003cspan style=\"color:#268bd2\"\u003eError\u003c/span\u003e())\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#719e07\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAssuming all has gone well we print the webhook details in to the console.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;%#v\\n\u0026#34;\u003c/span\u003e, Payload.Repository.Name)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;%#v\\n\u0026#34;\u003c/span\u003e, Payload.Issue.URL)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;%#v\\n\u0026#34;\u003c/span\u003e, Payload.Issue.Title)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;%#v\\n\u0026#34;\u003c/span\u003e, Payload.Issue.Body)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;%#v\\n\u0026#34;\u003c/span\u003e, Payload.Issue.Number)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  log.\u003cspan style=\"color:#268bd2\"\u003ePrintf\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;%#v\\n\u0026#34;\u003c/span\u003e, Payload.Issue.RepositoryURL)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFor this basic example, our main consists of two handlers and \u003ccode\u003ehttp.ListenAndServe()\u003c/code\u003e. We may want to extend this at some point to allow the use of alternative HTTP clients. To keep the code simple for now we\u0026rsquo;ll leave it.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003emain\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  log.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;Issuer\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  http.\u003cspan style=\"color:#268bd2\"\u003eHandleFunc\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;/\u0026#34;\u003c/span\u003e, status)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  http.\u003cspan style=\"color:#268bd2\"\u003eHandleFunc\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;/webhook\u0026#34;\u003c/span\u003e, handleWebhook)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  http.\u003cspan style=\"color:#268bd2\"\u003eListenAndServe\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;:3000\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#cb4b16\"\u003enil\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"next-time\"\u003eNext time\u003c/h2\u003e\n\u003cp\u003eWhen next we meet we\u0026rsquo;ll be adding the ability to create an issue based on the payload received. If that goes well - we\u0026rsquo;ll even add the code to add issues to the TODO project. 🎉\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eYou can find the code for this and most of the other Attempting to Learn Go posts in the repo on GitHub.\u003c/p\u003e\n\u003cp\u003e{% github shindakun/atlg %}\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n"
    },
    {
      "title": "Working On A New Flow",
      "date_published": "2019-06-04T15:08:36-07:00",
      "date_modified": "2019-06-04T15:08:36-07:00",
      "id": "https://shindakun.dev/posts/working-on-a-new-flow/",
      "url": "https://shindakun.dev/posts/working-on-a-new-flow/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003ch2 id=\"new-flow\"\u003eNew Flow\u003c/h2\u003e\n\u003cp\u003eI\u0026rsquo;ve realized over the last couple of weeks that I have way more projects that I want to work on then time in the day. I just don\u0026rsquo;t have as much free time as I used to and can\u0026rsquo;t seem to burn the midnight oil anymore.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve tried a few methods to try and keep my projects well defined and under a manageable scope. Each has had its drawbacks and never quite worked. My suspicion is that they have been too tailored too whoever thought of it.\u003c/p\u003e\n\u003cp\u003eA few days back \u003ca href=\"https://dev.to/ben\"\u003e@ben\u003c/a\u003e posted about limiting procrastination which brought me back to thinking about this.\u003c/p\u003e\n\u003cp\u003eMy attention will always be focused on what I shouldn\u0026rsquo;t be doing at any time - it\u0026rsquo;s taken me at least 10 minutes to get back to this sentence. With some practice and a system that works for me maybe I can tackle that and squeeze in getting some more projects done.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"repo-madness\"\u003eRepo Madness\u003c/h2\u003e\n\u003cp\u003eAfter some brainstorming, I decided I would try a different approach. I already keep most of my post ideas in a repo. Why can\u0026rsquo;t I keep all my todo\u0026rsquo;s in repo as well? This approach allows me to continue using tools I already use, no adding new services is a plus.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve just started planning this out but here is what I\u0026rsquo;ve got so far. It\u0026rsquo;s a bit manual at this point while I figure it out but bits should be automated as it comes into focus.\u003c/p\u003e\n\u003cp\u003eEach repo has a project with an automated kanban board. Issues from each repo need to bubble up to the TODO repo which I\u0026rsquo;ll use as my master todo list. From there I can shuffle them around to any other columns I might need as needed. At the start I think we\u0026rsquo;ll stick to just \u0026ldquo;To Do\u0026rdquo;, \u0026ldquo;In Progress\u0026rdquo;, and \u0026ldquo;Done\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eExample repos:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eTODO Repo\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTODO Project (automated kanban board)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePosts Repo\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePosts Project (automated kanban board)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eHugo Theme Repo\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTheme Project (automated kanban board)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eReading Repo\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eReading Project (automated kanban board)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eOK, let\u0026rsquo;s say we want to write this post. We first make an issue in the Posts repo. For now, we\u0026rsquo;ll also need to manually make a post in the TODO repo. In that issue, we\u0026rsquo;ll refer back to the posts repo \u003ccode\u003eshindakun/posts#1\u003c/code\u003e. This will link back so we can open the TODO kanban board and quickly move around to the other repos.\u003c/p\u003e\n\u003cp\u003eWe can then do the same in our Hugo repo. Or if I have a new book I want to read, \u003ca href=\"https://www.amazon.com/Procedural-Generation-Design-Tanya-Short-ebook/dp/B071GL6NRD/\"\u003eProcedural Generation in Game Design\u003c/a\u003e. I can throw an issue into the reading repo.\u003c/p\u003e\n\u003cp\u003eI can create issues from my phone if I need to, or jot them down in a notebook to be entered later. I\u0026rsquo;d need to remember to sync any issues to the TODO repo at first. Which leads us to\u0026hellip;\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"the-flaw\"\u003eThe Flaw\u003c/h2\u003e\n\u003cp\u003eThere is one major flaw - it\u0026rsquo;s too manual. But that shouldn\u0026rsquo;t stop us! It\u0026rsquo;s just another opportunity to write some code. This way we can enable webhooks on each of our repos, these will ping a small service which will, in turn, open a new issue in the TODO repo. This can be done with cloud functions or on a server. I\u0026rsquo;ll probably do a server version but, that can be easily converted to a cloud function I believe. This should be a nice refresher for some of the API stuff we worked on in the past.\u003c/p\u003e\n\u003cp\u003eOnce this is setup I expect that the system could actually work - at least for me.\u003c/p\u003e\n\u003cp\u003eExample JSON Payload:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;read PCG in game design\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;body\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;it\u0026#39;s on the kindle should probably read it\\n\\nshindakun/reading#1\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIt will need to be added to the TODO kanban board as well. That should just be a matter of using details from the newly created issue. I\u0026rsquo;ll worry about that once we get the first part working.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve been trying out the manual setup and it kind of works. For non-code tasks, I can close an issue then click through to the source repo and close that. That can probably be automated as well. For code related TODOs I can simply use the \u003ccode\u003ecloses shindakun/todo#1\u003c/code\u003e shorthand to close the TODO issue and \u003ccode\u003ecloses #2\u003c/code\u003e shorthand to close the \u0026ldquo;local\u0026rdquo; issue.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"next-time\"\u003eNext time\u003c/h2\u003e\n\u003cp\u003eJust us next time as we embark on the most \u0026ldquo;over-engineered\u0026rdquo; TODO system I could come up with. We\u0026rsquo;ll be writing the first part of the code portion of this project - a service to accept webhooks from GitHub.\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n"
    },
    {
      "title": "Hello World!",
      "date_published": "2019-06-01T00:00:00Z",
      "date_modified": "2019-06-01T00:00:00Z",
      "id": "https://shindakun.dev/posts/hello-world/",
      "url": "https://shindakun.dev/posts/hello-world/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003ch1 id=\"heading\"\u003e👋\u003c/h1\u003e\n\u003cp\u003eJust getting ready to launch my Hugo powered blog.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003epackage\u003c/span\u003e main\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#719e07\"\u003eimport\u003c/span\u003e \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;fmt\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003efunc\u003c/span\u003e \u003cspan style=\"color:#268bd2\"\u003emain\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     fmt.\u003cspan style=\"color:#268bd2\"\u003ePrintln\u003c/span\u003e(\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;Hello World!\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"notes\"\u003eNotes\u003c/h2\u003e\n\u003cp\u003eI suppose I should make some notes on what I\u0026rsquo;m doing. This likely won\u0026rsquo;t be complete but should capture all the major steps.\u003c/p\u003e\n\u003cp\u003eFirst, I dug through the Hugo site looking for a good starter theme. I eventually decided on \u003ca href=\"https://github.com/bake/solar-theme-hugo\"\u003eSolar\u003c/a\u003e a Hugo riff on a \u003ca href=\"https://ghost.org/\"\u003eGhost\u003c/a\u003e theme.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m planning on using them as a starting point and will be expanding it out in an off-shoot theme. I don\u0026rsquo;t think it will be too crazy, just changes to page headers and footers maybe.\u003c/p\u003e\n\u003cp\u003eI hadn\u0026rsquo;t updated my local Hugo install in a while so I grabbed it via \u003ccode\u003ego get\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ego get github.com/gohugoio/hugo\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNext, I made sure all the modules were installed. I\u0026rsquo;m on my Windows machine at the moment which doesn\u0026rsquo;t have Go modules enabled by default as of yet so we turn that on.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#268bd2\"\u003eGO111MODULE\u003c/span\u003e\u003cspan style=\"color:#719e07\"\u003e=\u003c/span\u003eon go mod tidy\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNow to create the base site and grab the theme.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehugo site new shindakun.dev\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#b58900\"\u003ecd\u003c/span\u003e shindakun.dev\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit submodule add https://github.com/bake/solar-theme-hugo\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eI then created my sub-theme \u0026ldquo;Solara\u0026rdquo;, which is in a private repo for now and added it to my site.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit submodule add https://github.com/shindakun/solara-hugo\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWe need to add both themes to the config so we edit \u003ccode\u003econfig.toml\u003c/code\u003e and add the line:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etheme = [\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;solara-hugo-test\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;solar-theme-hugo\u0026#34;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis will load my modifications first and then fall back to the basic theme. I imagine that at some point mine will be customized enough that I can remove the base.\u003c/p\u003e\n\u003ch2 id=\"quick-updates\"\u003eQuick Updates\u003c/h2\u003e\n\u003cp\u003eI wanted to make a few quick changes but didn\u0026rsquo;t want to think to hard so I borrowed some ideas for a few things from another Hugo theme \u003ca href=\"https://github.com/Vimux/Binario\"\u003eBinario\u003c/a\u003e. This is mostly so I can get a handle on the best set up for a theme and make some tweaks pretty quickly. I borrowed Binario\u0026rsquo;s 404 page and its basic 404 CSS. This also allows me to test including a custom CSS file just for Solara. It works exactly as expected so, that\u0026rsquo;s nice.\u003c/p\u003e\n\u003ch2 id=\"post-content\"\u003ePost Content\u003c/h2\u003e\n\u003cp\u003eI\u0026rsquo;m thinking I\u0026rsquo;ll have \u003ccode\u003econtent/posts\u003c/code\u003e as a \u003cdel\u003esubmodule\u003c/del\u003e separate repo so I can keep that repo separate. I have been toying with a new method of working on posts and that may fit in nicely. It also keeps much of the raw content on its own so it can basically be dropped in anywhere.\u003c/p\u003e\n\u003ch2 id=\"install\"\u003eInstall\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eClone \u003ccode\u003eshindakun.dev\u003c/code\u003e repo\u003c/li\u003e\n\u003cli\u003eInstall submodules, Solar and Solara\u003c/li\u003e\n\u003cli\u003eClone posts repo\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"build\"\u003eBuild\u003c/h2\u003e\n\u003cp\u003eThe site will be living on a Digital Ocean server and will be deployed from there.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehugo -d /path/to/site\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNo fancy deploy process for now. I\u0026rsquo;ll probably over engineer some sort of CI thing. Or maybe a commit webhook that will fetch and build the latest site.\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e"
    },
    {
      "title": "Better Static Glitch Sites",
      "date_published": "2017-05-23T20:33:44-07:00",
      "date_modified": "2017-05-23T20:33:44-07:00",
      "id": "https://shindakun.dev/posts/better-static-glitch-sites/",
      "url": "https://shindakun.dev/posts/better-static-glitch-sites/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003cp\u003eHere\u0026rsquo;s a small tip that comes out of the \u003ca href=\"https://support.glitch.com/t/support-static-json/1499/6?u=shindakun\"\u003eGlitch support forums\u003c/a\u003e. By default Glitch will start a static web server on your \u003ccode\u003e./app/\u003c/code\u003e directory once it does not find a \u003ccode\u003epackage.json\u003c/code\u003e file in the root of the app folder. This is not always the desired result - for instance what if the site generation is kicked off using \u003ccode\u003egrunt\u003c/code\u003e (or one of the countless other build tools) and you can\u0026rsquo;t remove \u003ccode\u003epackage.json\u003c/code\u003e? In a case like this, the start script in your \u003ccode\u003epackage.json\u003c/code\u003e may be something related to that build or attempting to start a static server of it\u0026rsquo;s own. Take the following snippet:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;scripts\u0026#34;\u003c/span\u003e: {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;build\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;grunt build\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;start\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;grunt connect:server:keepalive\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;test\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;grunt test\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#268bd2\"\u003e\u0026#34;postinstall\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;make build\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eGrunt is going try and start it\u0026rsquo;s own static server but, on Glitch we\u0026rsquo;re likely not able to reach that from the internet at large.\u003c/p\u003e\n\u003cp\u003eWhat can we do instead? Well, as luck would have it Glitch uses \u003ca href=\"https://www.npmjs.com/package/local-web-server\"\u003elocal-web-server\u003c/a\u003e as it\u0026rsquo;s static web server. This allows us leave the \u003ccode\u003epackage.json\u003c/code\u003e in place - so the default server won\u0026rsquo;t start but, by updating the start command to be\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#2aa198\"\u003e\u0026#34;start\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#2aa198\"\u003e\u0026#34;ws --port 3000 --directory \u0026#39;./\u0026#39; --forbid \u0026#39;/.env\u0026#39; --forbid \u0026#39;/.data\u0026#39; --log-format combined\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ewe\u0026rsquo;ll start the local-web-server on our own and leaving it accessible to the public. Make sure you do not leave off the forbid switches if you use \u003ccode\u003e.env\u003c/code\u003e or \u003ccode\u003e.data\u003c/code\u003e, it would not do to have those leak.\u003c/p\u003e\n\u003cp\u003eFinally, if your static site needs to start in a different directory just update the \u003ccode\u003edirectory\u003c/code\u003e switch, for example \u003ccode\u003e--directory './www'\u003c/code\u003e and you should be good to go.\u003c/p\u003e\n\u003chr\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align:center\"\u003eEnjoy this post?\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align:center\"\u003e\u003ca href=\"https://ko-fi.com/shindakun\"\u003eHow about buying me a coffee?\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n"
    },
    {
      "title": "Uses",
      "date_published": "0001-01-01T00:00:00Z",
      "date_modified": "0001-01-01T00:00:00Z",
      "id": "https://shindakun.dev/uses/",
      "url": "https://shindakun.dev/uses/",
      "authors": [
        {
          "name": "steve"
        }
      ],
      "content_html": "\u003ch2 id=\"websites\"\u003eWebsites\u003c/h2\u003e\n\u003cp\u003eThis website is built using \u003ca href=\"https://gohugo.io\"\u003eHugo\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"main-computer\"\u003eMain Computer\u003c/h2\u003e\n\u003cp\u003eDell XPS something or other, with an RTX something and 32gb of RAM\u003c/p\u003e\n\u003ch2 id=\"laptop\"\u003eLaptop\u003c/h2\u003e\n\u003cp\u003e2014 MacBook Air\u003c/p\u003e\n\u003ch2 id=\"webcam\"\u003eWebcam\u003c/h2\u003e\n\u003ch2 id=\"microphone\"\u003eMicrophone\u003c/h2\u003e\n\u003ch2 id=\"headset\"\u003eHeadset\u003c/h2\u003e\n"
    }
    ]
}