<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rohan Kaicker</title>
    <description>The latest articles on DEV Community by Rohan Kaicker (@rokaicker).</description>
    <link>https://dev.to/rokaicker</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F921387%2Ffa4a6e50-247a-4bc3-8405-a7f03e208b40.png</url>
      <title>DEV Community: Rohan Kaicker</title>
      <link>https://dev.to/rokaicker</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rokaicker"/>
    <language>en</language>
    <item>
      <title>OSD600 Lab 6</title>
      <dc:creator>Rohan Kaicker</dc:creator>
      <pubDate>Wed, 02 Nov 2022 23:50:16 +0000</pubDate>
      <link>https://dev.to/rokaicker/osd600-lab-6-29db</link>
      <guid>https://dev.to/rokaicker/osd600-lab-6-29db</guid>
      <description>&lt;p&gt;For our 6th lab we were asked to take a look at Docusaurus, and try to implement one of its features. &lt;/p&gt;

&lt;p&gt;Docusaurus is essentially a tool that developers can use to create aesthetically pleasing documentation, without worrying too much about building a website from scratch. &lt;/p&gt;

&lt;p&gt;In their own words, one of their goals was "&lt;em&gt;To put the focus on writing good documentation instead of worrying about the infrastructure of a website&lt;/em&gt;".&lt;/p&gt;

&lt;p&gt;Honestly, it was relatively easy to get a Docusaurus site built up from scratch. Mine can be found &lt;a href="https://rokaicker.github.io/SSGDocs/"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I decided to implement the "Sidebar"/ table of contents feature. Admittedly, I got a little busy in my personal life and wasn't able to dedicate too much time to this, so it's more of a proof of concept right now. But I did manage to get it working, in that my tool is able to generate a complete working table of contents based on the input folder that is selected. &lt;/p&gt;

&lt;p&gt;The commit for this feature can be found &lt;a href="https://github.com/rokaicker/StaticSiteGenerator/commit/940e4bf9c5161554d3d4f9a4c6e76ffa31c50da5"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I definitely haven't been able to make this tool as good I want to, but I think I'll be able to improve it in the upcoming weeks. &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Hacktoberfest Conclusion</title>
      <dc:creator>Rohan Kaicker</dc:creator>
      <pubDate>Mon, 31 Oct 2022 23:18:03 +0000</pubDate>
      <link>https://dev.to/rokaicker/hacktoberfest-conclusion-4bko</link>
      <guid>https://dev.to/rokaicker/hacktoberfest-conclusion-4bko</guid>
      <description>&lt;p&gt;To recap, for the month of October, our class participated in &lt;a href="https://hacktoberfest.com/"&gt;Hacktoberfest&lt;/a&gt;. This was my absolute first time contributing in open-source projects.&lt;/p&gt;

&lt;p&gt;Admittedly, I was extremely nervous and stressed going into this month. I had no idea what to expect in terms of project difficulty, how responsive repo maintainers are, and what the open-source community is like. &lt;/p&gt;

&lt;p&gt;To be honest, it also took me quite a long time to find issues/ projects that I found interesting. I was scouring the recommended sites such as &lt;a href="https://github.com/MunGell/awesome-for-beginners"&gt;Awesome for Beginners&lt;/a&gt;, and &lt;a href="https://up-for-grabs.net/#/"&gt;Up for Grabs&lt;/a&gt;, and also just going through Repos/ Issues marked with the "Hacktoberfest" label. &lt;/p&gt;

&lt;p&gt;Eventually, for my first Issue, I came across the &lt;a href="https://github.com/whyboris/Video-Hub-App"&gt;Video Hub App repo&lt;/a&gt;. Where I was able to work with technologies such as TypeScript and Electron, which I knew very little about. It took a little while, but I was able to successfully complete a feature that allowed users to filter out specific folders. This was a great experience because I was able to see how professional projects are organized, and the maintainer was very responsive. &lt;/p&gt;

&lt;p&gt;After this I really hit the ball rolling and was able to find more issues to work on. One thing that I enjoyed was that all of my PRs were drastically different from each other. I worked on correcting documentation for &lt;a href="https://adonisjs.com/"&gt;AdonisJS&lt;/a&gt;, fixed a HTTP Content-Type Header bug in &lt;a href="https://tinyhttp.v1rtl.site/"&gt;tiny-http&lt;/a&gt;, and then finally even created a &lt;a href="https://github.com/naveennamani/offline-docs"&gt;short script&lt;/a&gt; for users to load up their own local version of the Electron documentation site.  &lt;/p&gt;

&lt;p&gt;I think I can confidently say I learned more about open source and Git/ Github in the last month, than I have in the past 16 months that I have spent in this program. Creating branches for issues, submitting pull requests, merging, and rebasing branches were all very new to me, and I am so happy that I enrolled in this course before I graduated!&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Final Hacktoberfest PR</title>
      <dc:creator>Rohan Kaicker</dc:creator>
      <pubDate>Mon, 31 Oct 2022 22:57:19 +0000</pubDate>
      <link>https://dev.to/rokaicker/final-hacktoberfest-pr-b5f</link>
      <guid>https://dev.to/rokaicker/final-hacktoberfest-pr-b5f</guid>
      <description>&lt;p&gt;For my last Hacktoberfest PR, I was actually reached out to by &lt;a href="https://dev.to/naveennamani/comment/2275g"&gt;a repo maintainer on my previous blog post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Basically, this project aims to essentially allow people to create local documentation sites for various popular frameworks/ libraries. Essentially the project acts as a repository of scripts that users can copy and paste to create a fully functioning static site of their documentation (sort of related to our course project where we are developing a static site generator).&lt;/p&gt;

&lt;p&gt;Naveen (the project maintainer), saw that I had gained some experience using Electron from working on the Video Hub App, and asked if I'd like to contribute a script to get a local version of the &lt;a href="https://www.electronjs.org/docs/latest"&gt;Electron documentation.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I thought this would be a nice way for me to get familiar with how documentation sites are built. I immediately learned that Electron's documentation site was built using Docusaurus (which we'd later end up learning about in our course). &lt;/p&gt;

&lt;p&gt;I was able to learn how to built up a local copy of the site with just a small script, and was succesfully able to contribute to the repo!&lt;/p&gt;

&lt;p&gt;Issue: &lt;a href="https://github.com/naveennamani/offline-docs/issues/2"&gt;https://github.com/naveennamani/offline-docs/issues/2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PR: &lt;a href="https://github.com/naveennamani/offline-docs/pull/14"&gt;https://github.com/naveennamani/offline-docs/pull/14&lt;/a&gt;&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Hacktoberfest Week 2 (Pt. 2)</title>
      <dc:creator>Rohan Kaicker</dc:creator>
      <pubDate>Sun, 16 Oct 2022 20:37:57 +0000</pubDate>
      <link>https://dev.to/rokaicker/hacktoberfest-week-2-pt-2-273i</link>
      <guid>https://dev.to/rokaicker/hacktoberfest-week-2-pt-2-273i</guid>
      <description>&lt;p&gt;Following the theme of this week, another repo I stumbled upon this week was &lt;a href="https://github.com/tinyhttp"&gt;tinyhttp&lt;/a&gt;, which is another web framework. &lt;/p&gt;

&lt;p&gt;However, unlike AdonisJS (a "full featured" framework), tinyhttp aims for speed and simplicity by trying to minimize all of its dependencies. &lt;/p&gt;

&lt;p&gt;I worked on &lt;a href="https://github.com/tinyhttp/tinyhttp/issues/360"&gt;Issue 360&lt;/a&gt;. Essentially, when a user would set the "Content-Type" header before returning the file, the framework would overwrite the "previous" header, with the type that it determined from the files type.&lt;/p&gt;

&lt;p&gt;To solve this issue, I first spent time reading the "&lt;a href="https://tinyhttp.v1rtl.site/docs#response"&gt;Response&lt;/a&gt;" and looking at the code for &lt;a href="https://github.com/tinyhttp/tinyhttp/blob/55bffba526b05ebaab81c2b55dd793d7e807f06a/packages/send/src/sendFile.ts"&gt;res.sendFile()&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I saw that on &lt;a href="https://github.com/tinyhttp/tinyhttp/blob/55bffba526b05ebaab81c2b55dd793d7e807f06a/packages/send/src/sendFile.ts#L73"&gt;line 73&lt;/a&gt;, there was no check in place to see if the "Content-Type" header had previously been written. &lt;/p&gt;

&lt;p&gt;After this, I got curious on how Express handles this situation. What I found is that in Express, res.sendFile() will not actually set the "Content-Type" header, but instead it gets deferred to a separate function, and use the Node function "&lt;a href="https://github.com/expressjs/express/blob/master/lib/response.js#L1124"&gt;res.setHeader()&lt;/a&gt;", to handle it. This will actually result in the &lt;a href="https://nodejs.org/api/http.html#responsesetheadername-value"&gt;header being over written&lt;/a&gt; (just like tinyhttp). &lt;/p&gt;

&lt;p&gt;I checked AdonisJS, and the header will also get overwritten useing that framework too. This makes me think that this is a very niche use-case, but because the maintainer was looking for a PR, I added a check to only change the "Content-Type" header if it has not been previously set. I am curious to hear the maintainer's comments.&lt;/p&gt;

&lt;p&gt;My PR can be found here: &lt;a href="https://github.com/tinyhttp/tinyhttp/pull/363"&gt;https://github.com/tinyhttp/tinyhttp/pull/363&lt;/a&gt;&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Hacktoberfest Week 2 (Pt. 1)</title>
      <dc:creator>Rohan Kaicker</dc:creator>
      <pubDate>Sun, 16 Oct 2022 19:24:35 +0000</pubDate>
      <link>https://dev.to/rokaicker/hacktoberfest-week-2-pt-1-me1</link>
      <guid>https://dev.to/rokaicker/hacktoberfest-week-2-pt-1-me1</guid>
      <description>&lt;p&gt;To start this week off, I came across the &lt;a href="https://github.com/adonisjs"&gt;AdonisJS Framework&lt;/a&gt;. Up until now, the only framework that I was really familiar with was Express.js, but I alway sknew that others existed but never really looked into them. &lt;/p&gt;

&lt;p&gt;There are certain benefits to AdonisJS in that it is considered to be "fully featured", whereas Express.js may be seen as more barebones. &lt;/p&gt;

&lt;p&gt;With Express, you often have to use various npm packages to get the same level of functionality that Adonis offers straight out of the box.&lt;/p&gt;

&lt;p&gt;This includes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;ORM&lt;/li&gt;
&lt;li&gt;Templating&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I saw a few issues in their &lt;a href="https://github.com/adonisjs/docs.adonisjs.com"&gt;documentation repo&lt;/a&gt;, and I figured I'd fix two simple issues and count them towards 1 for my Release 0.2 (in my OSD600 class). &lt;/p&gt;

&lt;p&gt;The issues I fixed were:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/adonisjs/docs.adonisjs.com/issues/147"&gt;Issue 147&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/adonisjs/docs.adonisjs.com/issues/180"&gt;Issue 180&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Admittedly, these were very simple issues to fix (just fixing up some erroneous references to some functions), but I still felt as though they were important to fix to prevent confusion for new users of the framwork. &lt;/p&gt;

&lt;p&gt;The PRs I filed were:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/adonisjs/docs.adonisjs.com/pull/189"&gt;PR 189&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/adonisjs/docs.adonisjs.com/pull/191"&gt;PR 191&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>hacktoberfest</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Understanding "git rebase" and "git commit amend"</title>
      <dc:creator>Rohan Kaicker</dc:creator>
      <pubDate>Sat, 15 Oct 2022 23:15:41 +0000</pubDate>
      <link>https://dev.to/rokaicker/understanding-git-rebase-and-git-commit-amend-4maj</link>
      <guid>https://dev.to/rokaicker/understanding-git-rebase-and-git-commit-amend-4maj</guid>
      <description>&lt;p&gt;This week in OSD600, we learned about how to clean up our git history.&lt;/p&gt;

&lt;p&gt;We were first tasked with making a few improvement to our code base. &lt;/p&gt;

&lt;p&gt;I chose to improve my program by:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Separate text file handling&lt;/li&gt;
&lt;li&gt;Separte markdown file handling&lt;/li&gt;
&lt;li&gt;Utilizing fs.rmSync() for deleting the /dist folder instead of my previous method (using readderSync to find contents of /dist folder, and then calling unlinkSync). &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Using git rebase to "squash" all my commits into a single commit was definitely interesting. I didn't know this was a possibility, and in one of my Hacktoberfest PRs I actually have 10 commits for one feature upgrade - I plan on using git rebase to "squash" this down to 1 commit for cleanliness. &lt;/p&gt;

&lt;p&gt;Then using git commit ammend to modify the commit message was also a neat feature, and the ability to quickly add something to the previous commit (as I have multiple times found things I've missed right when I've commited something). &lt;/p&gt;

&lt;p&gt;These two are definitely features that I'll be using more often in the feature!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>First Time Contributing to a Public Repo (Hacktoberfest Week 1)</title>
      <dc:creator>Rohan Kaicker</dc:creator>
      <pubDate>Sun, 09 Oct 2022 23:30:18 +0000</pubDate>
      <link>https://dev.to/rokaicker/first-time-contributing-to-a-public-repo-hacktoberfest-week-1-3nee</link>
      <guid>https://dev.to/rokaicker/first-time-contributing-to-a-public-repo-hacktoberfest-week-1-3nee</guid>
      <description>&lt;h2&gt;
  
  
  Finding an "issue" to work on
&lt;/h2&gt;

&lt;p&gt;Following the spirit of &lt;a href="https://hacktoberfest.com/"&gt;Hacktober&lt;/a&gt;, we are required to attempt 4 Pull Requests for our OSD600 Release 0.2.&lt;/p&gt;

&lt;p&gt;Admittedly, I was a little stressed at the beginning (and sort of still am), because I didn't realize how many people would be participating in Hacktoberfest. Every interesting/ manageable "issue" I would find, would already have multiple people working on it/ already submitted PRs. &lt;/p&gt;

&lt;p&gt;I decided to expand my search to repositories/ issues that weren't tagged with the "hacktoberfest" tag, as my main goal was to just find an issue that I could work on. &lt;/p&gt;

&lt;p&gt;In doing so, I discovered the "&lt;a href="https://github.com/whyboris/Video-Hub-App"&gt;Video Hub App&lt;/a&gt;", which is essentially a cross-platform video library manager that is built on Angular and Electron. &lt;/p&gt;

&lt;p&gt;I worked on &lt;a href="https://github.com/whyboris/Video-Hub-App/issues/726"&gt;Issue #726 - filter "folder does not have"&lt;/a&gt;. Essentially, as "Video Hub App" is used as a way to search for videos, it gives the user the ability to specify filters (folders that include a key word, files that include a key word, resolution based filters, size based filters, etc.). However, the user requested the ability to filter out folders that have some key word in the search. &lt;/p&gt;

&lt;h2&gt;
  
  
  Learning New Things
&lt;/h2&gt;

&lt;p&gt;I noticed that the maintainer had made a comment on the issue saying that a similar filter exists for files (to exclude files that have a specific key term), so I figured I could base my changes off of something that already exists. &lt;/p&gt;

&lt;p&gt;However, once I started looking at the codebase I started to get a little overwhelmed, because my Angular skills were super basic and I had never used/ learned about the Electron platform before (although I knew it existed). So, the first thing I decided to do was to run through the &lt;a href="https://www.electronjs.org/docs/latest/tutorial/tutorial-prerequisites"&gt;Electron Tutorial&lt;/a&gt;, where I was able to get a basic understanding of how Electron works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementing Fix
&lt;/h2&gt;

&lt;p&gt;Once I had a basic understanding of Electron, I decided to run through the workflow of how the app works. Once I had the repo forked, cloned, and branched, I simply ran &lt;code&gt;npm install&lt;/code&gt; and then &lt;code&gt;npm start&lt;/code&gt; to start up the app. I then played around with it, and read the &lt;a href="https://videohubapp.com/en/guide"&gt;user guide&lt;/a&gt; until I got a basic understanding of what the application does. Then, using the Developer Tools, I tried to figure out how the filters are working.&lt;/p&gt;

&lt;p&gt;I ended up realizing that the maintainer had created the project in such a modular way, that I really did not have to do much coding at all to implement this feature. First, they had many "language" JSON files where essentially all the app text is stored (for buttons, settings, information, etc.), and is how the application is able to dynamically change the language presented in it's ui. So I first modified this file to include the extra placeholder, settings, information, etc. text that would be required by this new feature. &lt;/p&gt;

&lt;p&gt;I then had to specify a new filter for "folderExclusion" in the filters.ts file, and I followed the way the other filters had been done. I had to reorganize the layout here, since I wanted this new folder filter to be grouped with the other folder filter. The problem I ran into is that these filters are defined in an array, and I didn't realize that this array was being referenced in the home.component of the app. So essentially, because I changed the order of this array, in the app when a user was entering information for the various filters, the wrong filter would be applied. This then meant I had to manually update the index references of all the filters that were affected in home.component.html.&lt;/p&gt;

&lt;p&gt;Overall, I think I was able to get the feature working (&lt;a href="https://github.com/whyboris/Video-Hub-App/pull/772"&gt;PR here&lt;/a&gt;), and it was definitely a great learning experience. I was honestly a little inspired by how the maintainer had developed the codebase to make it so modular and easily upgradeably, and this really makes me want to fix up the Static Site Generator that I had been working on this class.&lt;/p&gt;

&lt;h2&gt;
  
  
  Functionality Demo
&lt;/h2&gt;

&lt;p&gt;To test the newly developed feature, I downloaded some stock videos from the internet (&lt;a href="https://gist.github.com/jsturgis/3b19447b304616f18657"&gt;found here&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;And then created the following folder structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;main folder/

&lt;ul&gt;
&lt;li&gt;buckbunny video/

&lt;ul&gt;
&lt;li&gt;test/

&lt;ul&gt;
&lt;li&gt;BigBuckBunny.mp4 (short movie about a rabbit)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;even more videos/

&lt;ul&gt;
&lt;li&gt;ForBiggerFun.mp4 (chromecast commercial)&lt;/li&gt;
&lt;li&gt;Sintel.mp4 (short fantasy movie)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;other demo videos/

&lt;ul&gt;
&lt;li&gt;ElephantsDream.mp4 (creepy short movie)&lt;/li&gt;
&lt;li&gt;ForBiggerBlazes.mp4 (another chromecast commercial)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As shown in the screenshots below, when I filter for a keyword in the folder that contains the video, the videos won't search up. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No Filter&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aCf9Hd2y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/im6h54e097gvnakg6qf7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aCf9Hd2y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/im6h54e097gvnakg6qf7.png" alt="Image description" width="880" height="583"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Filtering "test"&lt;/strong&gt; - (BigBuckBunny.mp4 should be excluded)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Tr1t3L78--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5d8enb9v3wgdke3dwak2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Tr1t3L78--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5d8enb9v3wgdke3dwak2.png" alt="Image description" width="880" height="584"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Filtering "demo"&lt;/strong&gt; - (ElephantsDream.mp4 and ForBiggerBlazes.mp4 should be excluded)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uq4IqLNy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qdcqqjq7lppayeqbugsv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uq4IqLNy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qdcqqjq7lppayeqbugsv.png" alt="Image description" width="880" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Filtering "more"&lt;/strong&gt; - (ForBiggerFun.mp4 and Sintel.mp4 should be excluded)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6qD_nO-f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cafx0whinqkkblu74sa4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6qD_nO-f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cafx0whinqkkblu74sa4.png" alt="Image description" width="880" height="580"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>angular</category>
      <category>typescript</category>
      <category>opensource</category>
    </item>
    <item>
      <title>OSD600 Blog #6 - Lab 4</title>
      <dc:creator>Rohan Kaicker</dc:creator>
      <pubDate>Sat, 08 Oct 2022 00:47:57 +0000</pubDate>
      <link>https://dev.to/rokaicker/osd600-blog-6-lab-4-ef0</link>
      <guid>https://dev.to/rokaicker/osd600-blog-6-lab-4-ef0</guid>
      <description>&lt;p&gt;For our 4th lab, we were tasked with partnering up again, and modifying our partner's Static Site Generator project to be able to take "options" from a "configuration" JSON file, instead of having to type them up in the command line. &lt;/p&gt;

&lt;p&gt;This way, the user only has to specify the location of the configuration file, where they can store multiple options, instead of having to manually type the various options in the command line, which can be more prone to errors. &lt;/p&gt;

&lt;p&gt;Coding the logic for the configuration file wasn't too difficult, as it was similar to the logic I already had for file handling. &lt;/p&gt;

&lt;p&gt;But what I found interesting in this week's lab was the use of remotes and Git fetch. We used remotes this week to monitor our partner's progress on modifying our own project, and used fetch to update the remotes. This way we were able to test our partner's progress, without actually modifying our local repo at all. &lt;/p&gt;

&lt;p&gt;Overall, I feel as though I still need to review the concept of remotes/ git fetch as I work towards completing my hacktoberfest release. &lt;/p&gt;

&lt;p&gt;Relevant Links:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/gulyapulya/SSGulnur/issues/10"&gt;Issue URL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/gulyapulya/SSGulnur/pull/11"&gt;PR URL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/gulyapulya/SSGulnur/commit/35ffbee59466f8e3802a876442510107ee610a7a"&gt;Merge Commit URL&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>opensource</category>
      <category>javascript</category>
    </item>
    <item>
      <title>OSD600 Blog #5 - Lab 3</title>
      <dc:creator>Rohan Kaicker</dc:creator>
      <pubDate>Fri, 30 Sep 2022 17:36:15 +0000</pubDate>
      <link>https://dev.to/rokaicker/osd600-blog-5-lab-3-575n</link>
      <guid>https://dev.to/rokaicker/osd600-blog-5-lab-3-575n</guid>
      <description>&lt;p&gt;For this weeks lab, we were tasked with creating two parallel branches on our program's repo, to create two new features. &lt;/p&gt;

&lt;p&gt;The idea behind this weeks activity was to get familiar with &lt;code&gt;git merge&lt;/code&gt;, and the idea of &lt;code&gt;fast-forward&lt;/code&gt; merges and &lt;code&gt;three-way recursive&lt;/code&gt; merges. &lt;/p&gt;

&lt;p&gt;Originally, I forgot to create both issue branches at the same time (so that they would have the same "starting point"), and created a branch just for my first issue and then merged that when it was solved. But then I realized this defeated the purpose of this weeks activity, so I decided to add 2 additional features to that I could get some practice with git merge. &lt;/p&gt;

&lt;p&gt;My links are given below (note - Issues 25 and 26 were the ones that were incorrectly initiated):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/rokaicker/StaticSiteGenerator"&gt;Project Repo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1 - &lt;a href="https://github.com/rokaicker/StaticSiteGenerator/issues/25"&gt;Issue #25&lt;/a&gt; - Ability to specify HTML language.&lt;br&gt;
&lt;a href="https://github.com/rokaicker/StaticSiteGenerator/commit/bfb3b2cfe088e5f2284e51402e33b02f3b078bf1"&gt;Merge Commit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2 - &lt;a href="https://github.com/rokaicker/StaticSiteGenerator/issues/26"&gt;Issue #26&lt;/a&gt; - Parse inline code blocks.&lt;br&gt;
&lt;a href="https://github.com/rokaicker/StaticSiteGenerator/commit/f4fb9a87f6f13ed12901ca7c07f45415f3991f9a"&gt;Merge Commit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3 - &lt;a href="https://github.com/rokaicker/StaticSiteGenerator/issues/27"&gt;Issue #27&lt;/a&gt; - Parse markdown horizontal rules.&lt;br&gt;
&lt;a href="https://github.com/rokaicker/StaticSiteGenerator/commit/c45f2c21c18c54df893a0fc37257d1a14002704b"&gt;Merge Commit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4 - &lt;a href="https://github.com/rokaicker/StaticSiteGenerator/issues/28"&gt;Issue #28&lt;/a&gt; - Parse single line blockquotes.&lt;br&gt;
&lt;a href="https://github.com/rokaicker/StaticSiteGenerator/commit/272b410f6f5dd0fda5d0fd77a8be1944811aa2b4"&gt;Merge Commit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For Issues 25 and 26, the "merges" were conflict free because of the wrong way I did them. But for Issues 27 and 28, I did encounter a "conflict" (shown below).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jJIEQq5X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sbpsm1tzqc3o264axoz2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jJIEQq5X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sbpsm1tzqc3o264axoz2.png" alt="Image description" width="880" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I thought it was interesting that Git will first prevent the merge from occuring (because of the presence of a conflict), and then actually modify your file to show you exactly where the conflict is occuring. I was able to quickly fix this issue, as all I had to do was separate the if-else statements. &lt;/p&gt;

&lt;p&gt;As I had mentioned in a previous blog post, I really wanted to take this course because I knew I'd get a chance to improve my git skills, and doing these weekly labs have really given me the chance to do just that. &lt;/p&gt;

&lt;p&gt;As for my project, I definitely have  alot of improvements to make (I beleive I have about 10 "issues" pending in my repo), and I look forward to seeing what improved versions of my project will look like!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>OSD600 Blog #4 - Lab 2</title>
      <dc:creator>Rohan Kaicker</dc:creator>
      <pubDate>Fri, 23 Sep 2022 00:34:29 +0000</pubDate>
      <link>https://dev.to/rokaicker/osd600-blog-4-lab-2-1302</link>
      <guid>https://dev.to/rokaicker/osd600-blog-4-lab-2-1302</guid>
      <description>&lt;p&gt;For lab 2, we were tasked with upgrading another student's Static Site Generator, while having other students work on upgrading our own Static Site Generator. &lt;/p&gt;

&lt;p&gt;I actually had the benefit of having two fellow students working on my project, and in total they were able to add 3 additional features to my project!&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a class="mentioned-user" href="https://dev.to/neilan99"&gt;@neilan99&lt;/a&gt; and &lt;a class="mentioned-user" href="https://dev.to/genne23v"&gt;@genne23v&lt;/a&gt;, my project now has the capability to parse Markdown files (as well as plain text files), and perform the proper markdown-to-html conversion on H1 headings, H2 headings, and embedded links. &lt;/p&gt;

&lt;p&gt;For my updates, I updated &lt;a class="mentioned-user" href="https://dev.to/neilan99"&gt;@neilan99&lt;/a&gt;'s project to also be able to parse Markdown files, as well as being able to convert Markdown bolded text (double asterisks enclosing a block of text) into HTML bolded tax (block of text surrounded by &amp;lt;strong&amp;gt;...&amp;lt;/strong&amp;gt; tags).&lt;/p&gt;

&lt;p&gt;The respective links are given below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/rokaicker/StaticSiteGenerator"&gt;My Project Repo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/NeilAn99/nan1-ssg/issues/6"&gt;My Filed Issue&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/NeilAn99/nan1-ssg/pull/7"&gt;My Pull Request&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/rokaicker/StaticSiteGenerator/pull/9"&gt;Neil's Pull Request For My Repo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/rokaicker/StaticSiteGenerator/pull/12"&gt;Wonkeun's Pull Request For My Repo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In updating Neil's project for adding support for parsing bolded markdown text, I actually ran into a few issues. &lt;/p&gt;

&lt;p&gt;At first, I wasn't sure how to determine if there was a valid line in the markdown file that had bolded text. I knew I had to utilize RegEx, however my RegEx skills are a little weak. Thankfully, I was able to find a StackOverflow post (&lt;a href="https://stackoverflow.com/a/2295943"&gt;here&lt;/a&gt;), which aided me in formulating my RegEx pattern. This I think is another benefit of the open source community, in that you can find how someone solved a similar issue to yours, and implement that solution to your specific problem. &lt;/p&gt;

&lt;p&gt;I also learned how to find the string index values of where the match was found and ended, to be able to replace the asterisks with the &amp;lt;strong&amp;gt; HTML tags. However, what I didn't realize at first is that I would have to take into consideration that as I make replacements, I would have to compensate for the added string length with the index values. I was able to quickly rectify this by adding 13 (the additional characters added to the string by adding the &amp;lt;strong&amp;gt;&amp;lt;\strong&amp;gt; tags, and removing the '**' characters), to each of the index positions as I made the replacements. &lt;/p&gt;

&lt;p&gt;On my first PR, Neil brought up a good point that my documentation was a little lacking in explaining what the RegEx portion of my code was doing, so I was able to quickly add in my explanation, and have my first PR succeed!&lt;/p&gt;

&lt;p&gt;As for the pull requests that I received for my project, I first reviewed Neil's pull request. I thought he did a really good job in adding Markdown support, and the ability to parse H1 headings. My only suggestion was a small one, in which he could shorten the code by removing duplicated sections. He quickly updated the PR to reflect this, and I was able to merge his changes into my main branch. &lt;/p&gt;

&lt;p&gt;For Wonkeun's PR, I felt bad because I made him do a little work. As I merged Neil's changes into my repo, it caused conflicts with Wonkeun's changes, so I required him to update his code to be able to workaround the newly added changes (as he was originally working on my base code - before markdown support was added). He was also quickly able to make the changes, and I was able to successfully test his code and merge his changes into my main branch. &lt;/p&gt;

&lt;p&gt;Testing and merging other people's code into my main branch really gave me the opportunity to learn more about how git branches work, as I was a little nervous about pulling changes onto my local machine. Thankfully, GitHub makes this easy, and provides you with the exact lines of commands that you need to be able to 1) Create a new branch to test the changes and 2) Merge the changes to the main branch once it has been confirmed to work. &lt;/p&gt;

&lt;p&gt;Overall, I thought this lab was a great experience in learning how collaboration works with git. One question that I do have remaining is that as I saw in my case (when Wonkeun's code encountered conflicts due to Neil's changes), I wonder if there is a proper procedure for multiple people making changes to the same codebase at the same time, or if conflicts like these are inevitable. &lt;/p&gt;

</description>
      <category>javascript</category>
      <category>opensource</category>
      <category>beginners</category>
      <category>osd600</category>
    </item>
    <item>
      <title>OSD600 Blog #3 - Lab 1</title>
      <dc:creator>Rohan Kaicker</dc:creator>
      <pubDate>Thu, 15 Sep 2022 23:15:56 +0000</pubDate>
      <link>https://dev.to/rokaicker/osd600-blog-3-lab-1-12l5</link>
      <guid>https://dev.to/rokaicker/osd600-blog-3-lab-1-12l5</guid>
      <description>&lt;p&gt;Hi Everyone!&lt;/p&gt;

&lt;p&gt;In Week #2, in our OSD600 class we partnered up and worked together to improve our base Release 0.1 code (which was our static site generator). &lt;/p&gt;

&lt;p&gt;Slack proved to be an amazing collaboration tool, as I was able to find someone (&lt;a href="https://github.com/NeilAn99"&gt;Neil An&lt;/a&gt;) to work with within an hour! Both of us were also using the same technologies to devleop our individual static site generators (node.js + commander module). &lt;/p&gt;

&lt;p&gt;It was definitely interesting to see how someone else tackled the same problem, even if it was with the same tools. For example, I was completely using synchronous JavaScript, but my Neil was using asynchronous JavaScript.&lt;/p&gt;

&lt;p&gt;Neil also brought the perspective of a Windows user, as I had mainly developed my program for Unix environments, and I did not realize that just because it worked in Unix environments it may not work in Windows. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Specifically, the issues that Neil found were:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/rokaicker/StaticSiteGenerator/issues/1"&gt;Installation does not work out of box&lt;/a&gt; - Basically, I thought running &lt;code&gt;npm install -g&lt;/code&gt; would automatically install the npm dependencies as well as install my tool globally on the system. However, it turned out it was required to run &lt;code&gt;npm install&lt;/code&gt; to install the node dependencies and then run &lt;code&gt;npm install -g&lt;/code&gt; to globally install my command line tool. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/rokaicker/StaticSiteGenerator/issues/2"&gt;The -v and --version options are missing information&lt;/a&gt; - Here I had completely missed the other requirement of the "version" command that it should also output the tool name (I definitely should have read the requirements more carefully). &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/rokaicker/StaticSiteGenerator/issues/3"&gt;Spaces are missing in the HTML file&lt;/a&gt; - This was one of the formatting issues where if a sentance carried on to the next line of the text file, there would be a missing space between words. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/rokaicker/StaticSiteGenerator/issues/4"&gt;Title and header are incorrectly created in some cases&lt;/a&gt; - There was a bit of a bug happening where my program would be missing text if the title (indicated by two blank lines after the title line) was not in the first line. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/rokaicker/StaticSiteGenerator/issues/5"&gt;Cannot run the rohan-ssg command directly on a windows terminal&lt;/a&gt; - This bug I wasn't entirely able to fix. I definitely have to do more research on this, but if anyone knows the answer please let me know below! I am able to run the program in windows using a bash shell, however using Powershell or Command Prompt does not work, so as a work around I specified the use of a bash shell in my tools README file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/rokaicker/StaticSiteGenerator/issues/6"&gt;Better formatting for HTML Files&lt;/a&gt; - Here Neil brought up a good point that all my &amp;lt;p&amp;gt;...&amp;lt;/p&amp;gt; tags were generated inside of a single line (and there could be hundreds of them). I fixed the formatting, and made it a lot easier to read by having all &amp;lt;p&amp;gt;...&amp;lt;/p&amp;gt; tags generated on a new line. &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The issues I found in Neil's project were:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/NeilAn99/nan1-ssg/issues/1"&gt;node_modules shouldn't be commited in git&lt;/a&gt; - In another class I took with Prof. Humphrey (CCP555), we learned about the importance of .gitignore files, and that the node_modules is a folder we should avoid committing to git.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/NeilAn99/nan1-ssg/issues/2"&gt;inability to specify direct path to a separate folder&lt;/a&gt; - In Neil's original code, the text files we needed to convert needed to be in the same folder as the program itself. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/NeilAn99/nan1-ssg/issues/3"&gt;need to add "node" to the beginning of the command&lt;/a&gt; - As a command line tool, I think we need to be able to simply just type tool name, without prepending "node" to it. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/NeilAn99/nan1-ssg/issues/4"&gt;possibly change stylesheet colors for less eye strain&lt;/a&gt; - In the original CSS design, there was a blue blackground behind blue text, which made it a little difficult to read. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/NeilAn99/nan1-ssg/issues/5"&gt;duplicate variables&lt;/a&gt; - Here, I thought we could shorten the code a little bit because the same piece of data was being used by two variables (when it could be just used by 1). &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Overall, it was a great experience having a second pair of eyes to look over my code, as Neil was able to find deficiencies in my code that I had not even noticed. I think this is one of the fundamental concepts of Open Source, that many eyes are constantly analyzing the same code base, to constantly improve the software. &lt;/p&gt;

</description>
      <category>osd600</category>
    </item>
    <item>
      <title>OSD600 Blog #2 - Release 0.1</title>
      <dc:creator>Rohan Kaicker</dc:creator>
      <pubDate>Sun, 11 Sep 2022 20:05:08 +0000</pubDate>
      <link>https://dev.to/rokaicker/osd600-blog-2-release-01-36g0</link>
      <guid>https://dev.to/rokaicker/osd600-blog-2-release-01-36g0</guid>
      <description>&lt;p&gt;For our first release in OSD600 (developing a CLI static site generator) I decided to implement the program using Node.js, by leveraging the &lt;a href="https://www.npmjs.com/package/commander"&gt;"commander" npm module&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The source code for the program can be found &lt;a href="https://github.com/rokaicker/StaticSiteGenerator"&gt;here.&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;The optional features I've implemented into the program are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ability to parse title from input to both populate the &amp;lt;title&amp;gt;...&amp;lt;/title&amp;gt; tag and to generate an &amp;lt;h1&amp;gt;...&amp;lt;/h1&amp;gt; at the top of the web page.&lt;/li&gt;
&lt;li&gt;Allowing the user to specify a stylesheet URL to be applied to all generated HTML files. &lt;/li&gt;
&lt;li&gt;Allow for a recursive search of the input folder, to also generate HTML files from text files in subfolders. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Examples of generated HTML files from text files can be found &lt;a href="https://rohan-ssg-example.vercel.app/"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I would greatly appreciate any and all feedback!&lt;/p&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;This tool enables the user to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Specify a ".txt" file to have it converted into an HTML webpage&lt;/li&gt;
&lt;li&gt;Specify a folder containing multiple ".txt" files to convert all of them into HTML web pages. The program will recursively search subfolders for ".txt" files as well. &lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;To install this program, first &lt;code&gt;git clone&lt;/code&gt; the repository. &lt;/p&gt;

&lt;p&gt;Then open a terminal inside of the newly created folder, and run &lt;code&gt;npm install -g&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This command will install the programming globally on your system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Options
&lt;/h2&gt;

&lt;p&gt;There are four options available to the user to use with this CLI program. &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Short Form&lt;/th&gt;
&lt;th&gt;Long Form&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;-v&lt;/td&gt;
&lt;td&gt;--version&lt;/td&gt;
&lt;td&gt;Outputs the current version of the program.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-h&lt;/td&gt;
&lt;td&gt;--help&lt;/td&gt;
&lt;td&gt;Outputs a help message explaining the program's usage.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-i&lt;/td&gt;
&lt;td&gt;--input&lt;/td&gt;
&lt;td&gt;Allows the user to specify either a single .txt file, or a folder containing .txt files.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-s&lt;/td&gt;
&lt;td&gt;--stylesheet&lt;/td&gt;
&lt;td&gt;Allows the user to specify a URL containing a CSS stylesheet to apply to the generated HTML files.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Current Version
&lt;/h3&gt;

&lt;p&gt;To check the current version of the program, the user can run:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rohan-ssg -v&lt;/code&gt; or &lt;code&gt;rohan-ssg --version&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Which will output:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;The current version is: x.x.x&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Help
&lt;/h3&gt;

&lt;p&gt;To see a message explaining the program, the user can run:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rohan-ssg -h&lt;/code&gt; or &lt;code&gt;rohan-ssg --help&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Which will output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;This program is used to generate a static HTML web page from a given .txt file OR a folder containing .txt files.
The following options are available: 
    -v, --version: current program version
    -h, --help: program instructions
    -i, --input: path input folder or file to be converted to HTML. Note that folders are recursively searched for .txt files.
    -s, --stylesheet: stylesheet url to be used in the HTML file

    The files will be saved in a '/dist' folder in the same directory as the input file/folder.

    For example, to generate a single HTML file from a .txt file with a specific stylesheet URL, use the following command:
    rohan-ssg -i .PATH/TO/FILE/input.txt -s https://example.com/stylesheet.css
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Input (with and without stylesheet)
&lt;/h3&gt;

&lt;p&gt;For a specific file, the user can run:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rohan-ssg -i PATH/TO/FILE/example.txt&lt;/code&gt; or &lt;code&gt;rohan-ssg --input PATH/TO/FILE/example.txt&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This will then generate a &lt;code&gt;/dist&lt;/code&gt; directory, containing the HTML file that had been generated.&lt;/p&gt;

&lt;p&gt;For a folder:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rohan-ssg -i PATH/TO/FOLDER&lt;/code&gt; or &lt;code&gt;rohan-ssg --input PATH/TO/FOLDER&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Similar to above, this will also generate a &lt;code&gt;/dist&lt;/code&gt; directory, which will contain all of the HTML files that had been generated from all of the .txt files inside of the specified folder (including subfolders). &lt;/p&gt;

&lt;p&gt;To specify a stylesheet to be applied to all HTML files, the user can choose to use the &lt;code&gt;-s&lt;/code&gt; or &lt;code&gt;--stylesheet&lt;/code&gt; option as follows:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rohan-ssg -i PATH/TO/FOLDER -s https://example.com/stylesheet.css&lt;/code&gt; or &lt;code&gt;rohan-ssg -i PATH/TO/FILE/example.txt -s https://example.com/stylesheet.css&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This will link the specified stylesheet (which must be a url) to all HTML files that have been generated. &lt;/p&gt;

</description>
      <category>osd600</category>
    </item>
  </channel>
</rss>
