<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[An Unexpected Coder]]></title>
  <link href="http://anunexpectedcoder.com/atom.xml" rel="self"/>
  <link href="http://anunexpectedcoder.com/"/>
  <updated>2016-03-17T09:29:52-07:00</updated>
  <id>http://anunexpectedcoder.com/</id>
  <author>
    <name><![CDATA[Catherine Meyers]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    
    <title type="html"><![CDATA[Don't Fence Me In: How to use Gulp with Shopify and Timber to Gain Control of Your Front End]]></title>
    <link href="http://anunexpectedcoder.com/blog/2015/12/03/dont-fence-me-in-how-to-use-gulp-with-shopify-and-timber-to-gain-control-of-your-front-end/"/>
    
    <updated>2015-12-03T08:59:01-08:00</updated>
    <id>http://anunexpectedcoder.com/blog/2015/12/03/dont-fence-me-in-how-to-use-gulp-with-shopify-and-timber-to-gain-control-of-your-front-end</id>
    
    <content type="html"><![CDATA[<p>For my first Shopify project, I decided to use the <a href="http://shopify.github.io/Timber/" target="_blank">Timber</a> framework to help with my theme development. I think it&rsquo;s a great way to get your theme started fast with the right setup. However, I hated the lack of organization and control of your front end code. Everything was dumped in the &lsquo;assets&rsquo; folder. Images and JS files and SCSS files all thrown in together? I think not! Plus I wasn&rsquo;t a huge fan their grid system and wanted to use <a href="http://neat.bourbon.io/" target="_blank">Bourbon Neat</a>, which is my favorite grid system. But here&rsquo;s what Timber has to say about imports and mixins and Bourbon Neat:</p>

<blockquote><p>You cannot use @imports in a Sass liquid file. That means no dependence on Compass, Bourbon or similar Sass frameworks.</p></blockquote>

<p>Don&rsquo;t tell me what to do Timber! I&rsquo;m a grown woman, and I&rsquo;ll use Bourbon if I want to!</p>

<p>So, I set out to set up my shopify-theme to be able to precompile assets locally. There&rsquo;s a bunch of documentation and blog posts on how to use Grunt to do this, but I like Gulp better&hellip;so I decided to figure that out.</p>

<p>TL;DR: I used Gulp, Browserify, and other tools to compile an external <code>lib</code> folder full of my organized JS, SCSS, and Images. The compiled files are added to Timber&rsquo;s <code>assets</code> folder and automatically uploaded to Shopify (along with any other files that were changed).</p>

<p>Here&rsquo;s the step-by-step version:</p>

<p>First, create your project. In your terminal:
<code>mkdir my-shopify-shop</code>
<code>cd my-shopify-shop</code></p>

<p>Then bring in Timber:
<code>git clone https://github.com/Shopify/Timber.git</code></p>

<p>Now that we have all the Timber files, we need to upload those to Shopify. For this we&rsquo;re going to use the <a href="https://github.com/Shopify/shopify_theme" target="_blank">shopify_theme gem</a>.</p>

<p><code>cd Timber</code></p>

<p>Open the <code>Gemfile</code> inside the Timber folder and add <code>gem 'shopify_theme'</code>. Then run <code>bundle install</code> in your terminal. In the root of the Timber folder, you have a <code>config-sample.yml</code> file. Duplicate that file, rename it <code>config.yml</code> and add your Shopify API  credentials to it. To get your API credentials, go into your Shopify admin panel and create a <a href="http://docs.shopify.com/api/authentication/creating-a-private-app" target="_blank">private app</a>.</p>

<p>Then add <code>config.yml</code> to your <code>.gitignore</code> (the one in the root of your project, not the Timber folder).</p>

<p>Using the shopify_theme gem, we are going to run <code>theme replace</code> in your terminal. Make sure you are in the <code>Timber</code> folder while doing this so it has access to your <code>Gemfile</code> and your <code>config.yml</code>. This will replace all of Shopify&rsquo;s default files, with Timber&rsquo;s default files. You only have to do this once. From here on out, any file we save will automatically be uploaded to Shopify through another library.</p>

<p>Go back to the root of your project <code>cd ..</code>.</p>

<p>Then make yourself a folder where you&rsquo;ll put all your precompiled assets. I named mine &lsquo;lib&rsquo;:
<code>mkdir lib</code>
<code>cd lib</code>
<code>mkdir js scss images</code></p>

<p>Here&rsquo;s what your file structure looks like so far:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>my-shopify-shop
</span><span class='line'>├── lib
</span><span class='line'>│   └── images
</span><span class='line'>│   └── js
</span><span class='line'>│   └── scss
</span><span class='line'>├── Timber
</span><span class='line'>│   └── All the automatically installed Timber stuff (assets, config, layout, etc.)</span></code></pre></td></tr></table></div></figure>


<p>Next let&rsquo;s start our gulp configuration. We need it to do the following:
1. Compile our scss and js files
2. Optimize images
3. Watch for changes
4. Upload any changes to Shopify</p>

<p>One disclaimer before we start. Say good-bye to livereload right now. Shed some tears and move on, cuz it ain&rsquo;t gonna work (at least that I&rsquo;ve tried). This is because we&rsquo;re working from Shopify&rsquo;s servers and not our own local environment. Our changes have to be pushed up to Shopfiy, then you have to make a hard refresh to see the changes. I know. Life is hard.</p>

<p>Go back to the root <code>cd ..</code> and <code>touch gulpfile.js</code></p>

<p>You&rsquo;re also going to have to create a &lsquo;package.json&rsquo; for all your node_modules.
<code>npm init</code> and press enter through all the prompts until it&rsquo;s created.</p>

<p>Let&rsquo;s start with uploading changes to Shopify.
<code>npm install --global gulp</code>
<code>npm install --save-dev gulp gulp-watch gulp-shopify-upload</code>
That&rsquo;s going to install both <a href="https://github.com/gulpjs/gulp/blob/master/docs/getting-started.md" target="_blank">gulp</a>, <a href="https://www.npmjs.com/package/gulp-watch" target="_blank"></a>, and <a href="https://github.com/mikenorthorp/gulp-shopify-upload" target="_blank">gulp-shopify-upload</a></p>

<p>Create a file called <code>config.json</code> in your root and put your Shopify API credentials in there. It should look something like this (but obviously with all your credentials):</p>

<p>config.json</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='json'><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="nt">&quot;shopify_api_key&quot;</span><span class="p">:</span> <span class="s2">&quot;whateveryourapikeyishere&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="nt">&quot;shopify_api_password&quot;</span><span class="p">:</span> <span class="s2">&quot;whateveryourapipasswordishere&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="nt">&quot;shopify_url&quot;</span><span class="p">:</span> <span class="s2">&quot;YOUR-STORE-NAME.myshopify.com&quot;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can also add your theme id if you&rsquo;re using one. Don&rsquo;t forget to add <code>config.json</code> to your <code>.gitignore</code>!!!! You don&rsquo;t want to be sharing your Shopify API credentials with the world.</p>

<p>Now let&rsquo;s create a task for gulp-shopify-upload.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Gulp plugin setup</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">gulp</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;gulp&#39;</span><span class="p">);</span>
</span><span class='line'><span class="c1">// Watches single files</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">watch</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;gulp-watch&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">gulpShopify</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;gulp-shopify-upload&#39;</span><span class="p">);</span>
</span><span class='line'><span class="c1">// Grabs your API credentials</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">config</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./config.json&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">gulp</span><span class="p">.</span><span class="nx">task</span><span class="p">(</span><span class="s1">&#39;shopifywatch&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">options</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="s2">&quot;basePath&quot;</span><span class="o">:</span> <span class="s2">&quot;./Timber/&quot;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="nx">watch</span><span class="p">(</span><span class="s1">&#39;./Timber/+(assets|layout|config|snippets|templates|locales)/**&#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">pipe</span><span class="p">(</span><span class="nx">gulpShopify</span><span class="p">(</span><span class="nx">config</span><span class="p">.</span><span class="nx">shopify_api_key</span><span class="p">,</span> <span class="nx">config</span><span class="p">.</span><span class="nx">shopify_api_password</span><span class="p">,</span> <span class="nx">config</span><span class="p">.</span><span class="nx">shopify_url</span><span class="p">,</span> <span class="kc">null</span><span class="p">,</span> <span class="nx">options</span><span class="p">));</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Default gulp action when gulp is run</span>
</span><span class='line'><span class="nx">gulp</span><span class="p">.</span><span class="nx">task</span><span class="p">(</span><span class="s1">&#39;default&#39;</span><span class="p">,</span> <span class="p">[</span>
</span><span class='line'>  <span class="s1">&#39;shopifywatch&#39;</span>
</span><span class='line'><span class="p">]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Notice a few things here. We changed the url for the watch command to go one level deeper since we&rsquo;re changing the file structure from the example given in gulp-shopify-upload&rsquo;s docs. And we have to add the option for basePath for the same reason. Also, we&rsquo;ve moved all our API credentials into a secret config.json file that we&rsquo;ll require at the top.</p>

<p>Now if you run <code>gulp</code> in your terminal, it&rsquo;ll watch for any changes. Go ahead and make a change to one of the templates. You&rsquo;ll see it say &lsquo;Upload Complete&rsquo; in the terminal. But remember, you&rsquo;ll have to do a hard refresh in order to see the change in your browser. Did a single tear just fall down your cheek? I know. Me too.</p>

<p>Next we&rsquo;ll want to precompile our scss and spit the compiled file into Timber&rsquo;s assets folder. Also, I&rsquo;m going to include Bourbon Neat here along with some handy error handling.</p>

<p><code>npm install --save-dev gulp-sass gulp-autoprefixer gulp-notify node-bourbon node-neat</code></p>

<p>Add to your gulpfile:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Compiles SCSS files</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">sass</span>         <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;gulp-sass&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">autoprefixer</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;gulp-autoprefixer&#39;</span><span class="p">);</span>
</span><span class='line'><span class="c1">// Notifies of errors</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">notify</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">&quot;gulp-notify&quot;</span><span class="p">);</span>
</span><span class='line'><span class="c1">// Includes the Bourbon Neat libraries</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">neat</span>         <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;node-neat&#39;</span><span class="p">).</span><span class="nx">includePaths</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">handleErrors</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">args</span> <span class="o">=</span> <span class="nb">Array</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">slice</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">arguments</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Send error to notification center with gulp-notify</span>
</span><span class='line'>  <span class="nx">notify</span><span class="p">.</span><span class="nx">onError</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">title</span><span class="o">:</span> <span class="s2">&quot;Compile Error&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">message</span><span class="o">:</span> <span class="s2">&quot;&lt;%= error %&gt;&quot;</span>
</span><span class='line'>  <span class="p">}).</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">args</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Keep gulp from hanging on this task</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">emit</span><span class="p">(</span><span class="s1">&#39;end&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nx">gulp</span><span class="p">.</span><span class="nx">task</span><span class="p">(</span><span class="s1">&#39;sass&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">gulp</span><span class="p">.</span><span class="nx">src</span><span class="p">(</span><span class="s1">&#39;./lib/scss/*.{sass,scss}&#39;</span><span class="p">)</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">pipe</span><span class="p">(</span><span class="nx">sass</span><span class="p">({</span><span class="nx">includePaths</span><span class="o">:</span> <span class="nx">neat</span><span class="p">}))</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;error&#39;</span><span class="p">,</span> <span class="nx">handleErrors</span><span class="p">)</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">pipe</span><span class="p">(</span><span class="nx">autoprefixer</span><span class="p">({</span> <span class="nx">browsers</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;last 2 version&#39;</span><span class="p">]</span> <span class="p">}))</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">pipe</span><span class="p">(</span><span class="nx">gulp</span><span class="p">.</span><span class="nx">dest</span><span class="p">(</span><span class="s1">&#39;./Timber/assets&#39;</span><span class="p">));</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">gulp</span><span class="p">.</span><span class="nx">task</span><span class="p">(</span><span class="s1">&#39;watch&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">gulp</span><span class="p">.</span><span class="nx">watch</span><span class="p">(</span><span class="s1">&#39;./lib/scss/**/*.{sass,scss}&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;sass&#39;</span><span class="p">]);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>And add it to the default task:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">gulp</span><span class="p">.</span><span class="nx">task</span><span class="p">(</span><span class="s1">&#39;default&#39;</span><span class="p">,</span> <span class="p">[</span>
</span><span class='line'>  <span class="s1">&#39;shopifywatch&#39;</span><span class="p">,</span> <span class="s1">&#39;watch&#39;</span>
</span><span class='line'><span class="p">]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Change the stylesheet tag in Timber&rsquo;s template to point to your compiled file instead of the default &lsquo;timber.scss.css&rsquo;. For me it&rsquo;s on line 31 of <code>layout/theme.liquid</code>.</p>

<p>Now to compile our JavaScript files. For this we&rsquo;re using <a href="http://browserify.org/", target="_blank">browserify</a>, <a href="https://github.com/substack/watchify" target="_blank">watchify</a>, and <a href="https://www.npmjs.com/package/vinyl-source-stream" target="_blank">vinyl-source-stream</a>. Keep in mind, this is a pretty simple gulpfile. You can really beef this up, especially when it comes to browserify.</p>

<p><code>npm install --save-dev browserify watchify vinyl-source-stream</code></p>

<p>Add to your gulpfile:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Concats your JS files</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">browserify</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;browserify&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">watchify</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;watchify&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">source</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;vinyl-source-stream&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">gulp</span><span class="p">.</span><span class="nx">task</span><span class="p">(</span><span class="s1">&#39;browserify&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">browserify</span><span class="p">(</span><span class="s1">&#39;./lib/js/app.js&#39;</span><span class="p">)</span>
</span><span class='line'>      <span class="p">.</span><span class="nx">bundle</span><span class="p">()</span>
</span><span class='line'>      <span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;error&#39;</span><span class="p">,</span> <span class="nx">handleErrors</span><span class="p">)</span>
</span><span class='line'>      <span class="c1">//Pass desired output filename to vinyl-source-stream</span>
</span><span class='line'>      <span class="p">.</span><span class="nx">pipe</span><span class="p">(</span><span class="nx">source</span><span class="p">(</span><span class="s1">&#39;bundle.js&#39;</span><span class="p">))</span>
</span><span class='line'>      <span class="c1">// Start piping stream to tasks!</span>
</span><span class='line'>      <span class="p">.</span><span class="nx">pipe</span><span class="p">(</span><span class="nx">gulp</span><span class="p">.</span><span class="nx">dest</span><span class="p">(</span><span class="s1">&#39;./Timber/assets/&#39;</span><span class="p">));</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>And add this to your watch task:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">gulp</span><span class="p">.</span><span class="nx">task</span><span class="p">(</span><span class="s1">&#39;watch&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">gulp</span><span class="p">.</span><span class="nx">watch</span><span class="p">(</span><span class="s1">&#39;./lib/scss/**/*.{sass,scss}&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;sass&#39;</span><span class="p">]);</span>
</span><span class='line'>  <span class="nx">gulp</span><span class="p">.</span><span class="nx">watch</span><span class="p">(</span><span class="s1">&#39;./lib/js/**/*.js&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;browserify&#39;</span><span class="p">]);</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">watcher</span> <span class="o">=</span> <span class="nx">watchify</span><span class="p">(</span><span class="nx">browserify</span><span class="p">({</span>
</span><span class='line'>    <span class="c1">// Specify the entry point of your app</span>
</span><span class='line'>    <span class="nx">entries</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;./lib/js/app.js&#39;</span><span class="p">],</span>
</span><span class='line'>    <span class="nx">debug</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">cache</span><span class="o">:</span> <span class="p">{},</span> <span class="nx">packageCache</span><span class="o">:</span> <span class="p">{},</span> <span class="nx">fullPaths</span><span class="o">:</span> <span class="kc">true</span>
</span><span class='line'>  <span class="p">}));</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="nx">watcher</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;update&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">watcher</span><span class="p">.</span><span class="nx">bundle</span><span class="p">()</span>
</span><span class='line'>      <span class="p">.</span><span class="nx">pipe</span><span class="p">(</span><span class="nx">source</span><span class="p">(</span><span class="s1">&#39;bundle.js&#39;</span><span class="p">))</span>
</span><span class='line'>      <span class="p">.</span><span class="nx">pipe</span><span class="p">(</span><span class="nx">gulp</span><span class="p">.</span><span class="nx">dest</span><span class="p">(</span><span class="s1">&#39;./Timber/assets/&#39;</span><span class="p">))</span>
</span><span class='line'>  <span class="p">})</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Add another script tag below the one calling for <code>timber.js</code> (for me it&rsquo;s at line 379) to call for your bundled js <code>bundle.js</code> in <code>layout/theme.liquid</code>.</p>

<p>Now let&rsquo;s opmtimize our images. For that we use <a href="https://github.com/sindresorhus/gulp-imagemin" target="_blank">gulp-imagemin</a> and <a href="https://www.npmjs.com/package/gulp-changed" target="_blank">gulp-changed</a>.</p>

<p><code>npm install --save-dev gulp-imagemin gulp-changed</code></p>

<p>Add this to your gulpfile:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">imagemin</span>   <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;gulp-imagemin&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">changed</span>    <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;gulp-changed&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">gulp</span><span class="p">.</span><span class="nx">task</span><span class="p">(</span><span class="s1">&#39;images&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">gulp</span><span class="p">.</span><span class="nx">src</span><span class="p">(</span><span class="s1">&#39;./lib/images/**&#39;</span><span class="p">)</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">pipe</span><span class="p">(</span><span class="nx">changed</span><span class="p">(</span><span class="s1">&#39;./Timber/assets/&#39;</span><span class="p">))</span> <span class="c1">// Ignore unchanged files</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">pipe</span><span class="p">(</span><span class="nx">imagemin</span><span class="p">())</span> <span class="c1">// Optimize</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">pipe</span><span class="p">(</span><span class="nx">gulp</span><span class="p">.</span><span class="nx">dest</span><span class="p">(</span><span class="s1">&#39;./Timber/assets/&#39;</span><span class="p">))</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>And add <code>gulp.watch('lib/images/*.{jpg,jpeg,png,gif,svg}', ['images']);</code> to your gulp watch task.</p>

<p>If you&rsquo;re using local font files, you&rsquo;ll also want to add a fonts taks that will throw your font files in Timber&rsquo;s asset folder as well.</p>

<p>You can check out a finished example of this code <a href="https://github.com/ccmeyers/shopify-timber-gulp-setup" target="_blank">here</a>.</p>
]]></content>
    
  </entry>
  
  <entry>
    
    <title type="html"><![CDATA[Slide Slide Slippity Slide]]></title>
    <link href="http://anunexpectedcoder.com/blog/2015/09/23/slide-slide-slippity-slide/"/>
    
    <updated>2015-09-23T13:47:44-07:00</updated>
    <id>http://anunexpectedcoder.com/blog/2015/09/23/slide-slide-slippity-slide</id>
    
    <content type="html"><![CDATA[<h2>How to Create a Slide Presentation with JavaScript</h2>

<p>Recently a client needed a website that could be used both as a presentation tool (like a Keynote or PowerPoint presentation) and as a stand-alone website to be sent to possible investors to scroll through.</p>

<p>There are a lot of great libraries out there that help you mimic the functionality of a Keynote presentation. I took a look at <a href="http://flowtime-js.marcolago.com/" target="_blank">flowtime</a>, <a href="http://lab.hakim.se/reveal-js/#/" target="_blank">reveal.js</a>, and <a href="http://impress.github.io/impress.js/#/bored" target="_blank">impress.js</a>. But, these libraries are big and seemed like overkill for what I needed to do. Also, I really wanted to see if I could build this on my own.</p>

<p>(If you want to jump ahead to the finished product, here&rsquo;s <a href="http://anunexpectedcoder.com/slide-presentation/" target="_blank">an example</a> of what I built along with <a href="https://github.com/ccmeyers/slide-presentation" target="_blank">the code on github</a>.)</p>

<p>First I made my panels. I broke up the site into sections (literally &mdash; using <code>&lt;section&gt;&lt;/section&gt;</code> tags) and made each section <code>height = 100vh</code>. Actually, I had to make room for my fixed nav up top, so it was really <code>height = calc(100vh - 102)</code>. Now that I had things looking the way they should, I needed to make them act the way they should.</p>

<p>I soon realized that my biggest challenge was to designate which section was the current panel so we could find the previous and next panels. I found this <a href="http://stackoverflow.com/questions/22659903/jquery-scroll-to-next-prev-section-by-keyup-keydown" target="_blank">stackoverflow answer</a> that seemed like it could be a solution. It used the <a href="https://github.com/customd/jquery-visible" target="_blank">jquery-visible plugin</a> to tell if a section was in view and then found next and previous based on that. However, after the better part of a day going down that path, I realized it wouldn&rsquo;t work for my needs. Before giving up, I asked another engineer if he had any idea how I could make this work (shout out, Kevin!). He said, &ldquo;Why don&rsquo;t you try using waypoints?&rdquo; YES! Why didn&rsquo;t I think of that?</p>

<p><a href="http://imakewebthings.com/waypoints/" target="_blank">Waypoints</a> is a great library that lets you trigger a function on scroll. I could make each section have its own waypoint where it gets the class &lsquo;currentPanel&rsquo; as soon as it&rsquo;s almost to the top of the screen.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">getCurrentPanel</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">navHeight</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;header&#39;</span><span class="p">).</span><span class="nx">outerHeight</span><span class="p">()</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;section&#39;</span><span class="p">).</span><span class="nx">each</span><span class="p">(</span><span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">index</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nx">index</span><span class="p">(</span><span class="s1">&#39;section&#39;</span><span class="p">),</span>
</span><span class='line'>        <span class="nx">currentSection</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;section&#39;</span><span class="p">).</span><span class="nx">get</span><span class="p">(</span><span class="nx">index</span><span class="p">),</span>
</span><span class='line'>        <span class="nx">nextSection</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="nx">currentSection</span><span class="p">).</span><span class="nx">next</span><span class="p">(),</span>
</span><span class='line'>        <span class="nx">prevSection</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="nx">currentSection</span><span class="p">).</span><span class="nx">prev</span><span class="p">();</span>
</span><span class='line'>        <span class="nx">currentPanelClass</span> <span class="o">=</span> <span class="s1">&#39;current-panel&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">waypointsDown</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Waypoint</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">element</span><span class="o">:</span> <span class="nx">currentSection</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">handler</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">direction</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">direction</span> <span class="o">===</span> <span class="s1">&#39;down&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">$</span><span class="p">(</span><span class="nx">currentSection</span><span class="p">).</span><span class="nx">addClass</span><span class="p">(</span><span class="nx">currentPanelClass</span><span class="p">);</span>
</span><span class='line'>          <span class="k">if</span> <span class="p">(</span><span class="nx">prevSection</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">prevSection</span><span class="p">.</span><span class="nx">removeClass</span><span class="p">(</span><span class="nx">currentPanelClass</span><span class="p">);</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="nx">offset</span><span class="o">:</span> <span class="mi">200</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">waypointsUp</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Waypoint</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">element</span><span class="o">:</span> <span class="nx">currentSection</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">handler</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">direction</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">direction</span> <span class="o">===</span> <span class="s1">&#39;up&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">$</span><span class="p">(</span><span class="nx">currentSection</span><span class="p">).</span><span class="nx">addClass</span><span class="p">(</span><span class="nx">currentPanelClass</span><span class="p">);</span>
</span><span class='line'>          <span class="k">if</span> <span class="p">(</span><span class="nx">$</span><span class="p">(</span><span class="nx">currentSection</span><span class="p">).</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">nextSection</span><span class="p">.</span><span class="nx">removeClass</span><span class="p">(</span><span class="nx">currentPanelClass</span><span class="p">);</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="nx">offset</span><span class="o">:</span> <span class="nx">navHeight</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>In that function, I&rsquo;m looping through all the sections and assigning a waypoint to each based on its index. As you&rsquo;re scrolling down, a section will get the class &lsquo;currentPanel&rsquo; when it&rsquo;s 200px from the top. On the way back up, a section would get that class as soon as it hits the nav. I&rsquo;m also making sure that as the &lsquo;currentPanel&rsquo; class is added to one section, it is removed from the section that just had it.</p>

<p>Now that I could find the current panel, I needed to designate next and previous panels and animate the scroll.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">findNext</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">that</span> <span class="o">=</span> <span class="k">this</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">currentPanel</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;.current-panel&#39;</span><span class="p">),</span>
</span><span class='line'>      <span class="nx">nextPanel</span> <span class="o">=</span> <span class="nx">currentPanel</span><span class="p">.</span><span class="nx">next</span><span class="p">(</span><span class="s1">&#39;section&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nx">nextPanel</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">that</span><span class="p">.</span><span class="nx">scrollToElement</span><span class="p">(</span><span class="nx">nextPanel</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">},</span>
</span><span class='line'>
</span><span class='line'><span class="nx">findPrev</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">that</span> <span class="o">=</span> <span class="k">this</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">currentPanel</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;.current-panel&#39;</span><span class="p">),</span>
</span><span class='line'>      <span class="nx">prevPanel</span> <span class="o">=</span> <span class="nx">currentPanel</span><span class="p">.</span><span class="nx">prev</span><span class="p">(</span><span class="s1">&#39;section&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nx">prevPanel</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">that</span><span class="p">.</span><span class="nx">scrollToElement</span><span class="p">(</span><span class="nx">prevPanel</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">},</span>
</span><span class='line'>
</span><span class='line'><span class="nx">scrollToElement</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">panel</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">navHeight</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;header&#39;</span><span class="p">).</span><span class="nx">outerHeight</span><span class="p">();</span>
</span><span class='line'>  <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;html, body&#39;</span><span class="p">).</span><span class="nx">animate</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">scrollTop</span><span class="o">:</span> <span class="nx">panel</span><span class="p">.</span><span class="nx">offset</span><span class="p">().</span><span class="nx">top</span> <span class="o">-</span> <span class="nx">navHeight</span>
</span><span class='line'>  <span class="p">},</span> <span class="mi">200</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now I needed that scroll to happen in response to a presentation clicker. We had <a href="http://www.logitech.com/en-us/product/wireless-presenter-r400?crid=11" target="_blank">this one</a> in the office, so I connected it to my computer and console logged the <a href="https://css-tricks.com/snippets/javascript/javascript-keycodes/" target="_blank">keyCodes</a> to find which it simulated. It was using 33 and 34 (page up and page down). I also added a few more keyCodes in case the client forgot his clicker and needed to use the keyboard to move through the site.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">slider</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">that</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">$</span><span class="p">(</span><span class="nb">document</span><span class="p">).</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;keydown&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">){</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">$currentPanel</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;.currentPanel&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">keyCode</span> <span class="o">===</span> <span class="mi">40</span> <span class="o">||</span> <span class="nx">e</span><span class="p">.</span><span class="nx">keyCode</span> <span class="o">===</span> <span class="mi">32</span> <span class="o">||</span> <span class="nx">e</span><span class="p">.</span><span class="nx">keyCode</span> <span class="o">===</span> <span class="mi">13</span>  <span class="o">||</span> <span class="nx">e</span><span class="p">.</span><span class="nx">keyCode</span> <span class="o">===</span> <span class="mi">34</span> <span class="o">||</span> <span class="nx">e</span><span class="p">.</span><span class="nx">keyCode</span> <span class="o">===</span> <span class="mi">39</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">e</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">();</span>
</span><span class='line'>      <span class="nx">that</span><span class="p">.</span><span class="nx">findNext</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">keyCode</span> <span class="o">===</span> <span class="mi">38</span> <span class="o">||</span> <span class="nx">e</span><span class="p">.</span><span class="nx">keyCode</span> <span class="o">===</span> <span class="mi">33</span> <span class="o">||</span> <span class="nx">e</span><span class="p">.</span><span class="nx">keyCode</span> <span class="o">===</span> <span class="mi">37</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">e</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">();</span>
</span><span class='line'>      <span class="nx">that</span><span class="p">.</span><span class="nx">findPrev</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Thanks to my &lsquo;getCurrentPanel&rsquo; function, I knew that the panel with the class &lsquo;currentPanel&rsquo; was my current panel, and could fire my &lsquo;findNext&rsquo; or &lsquo;findPrev&rsquo; functions based on whether the keyCodes called for up or down movement. Yay!</p>

<p>On to what I call &lsquo;fragmented&rsquo; panels. By this I mean sections that call for a halt in the movement up and down and instead move through the content inside the panel itself. We&rsquo;re also looking out for a <code>fragment-subnav</code> if it has one. All the fragmented examples in my demo site have subnavs. They give a great visual cue that there are other fragments and lets the user easily navigate them. But a subnav is not required.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">fragmentedPanel</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">movement</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">that</span> <span class="o">=</span> <span class="k">this</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">currentFragmentedPanel</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;.current-panel.fragmented&#39;</span><span class="p">),</span>
</span><span class='line'>      <span class="nx">currentFragmentedParts</span> <span class="o">=</span> <span class="nx">currentFragmentedPanel</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="s1">&#39;.fragmented-part.active&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">currentFragmentedParts</span><span class="p">.</span><span class="nx">each</span><span class="p">(</span><span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">fragmentIndex</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nx">index</span><span class="p">(</span><span class="s1">&#39;.current-panel .fragmented-part&#39;</span><span class="p">),</span>
</span><span class='line'>        <span class="nx">fragment</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;.current-panel .fragmented-part&#39;</span><span class="p">).</span><span class="nx">get</span><span class="p">(</span><span class="nx">fragmentIndex</span><span class="p">),</span>
</span><span class='line'>        <span class="nx">nextFragment</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="nx">fragment</span><span class="p">).</span><span class="nx">next</span><span class="p">(),</span>
</span><span class='line'>        <span class="nx">prevFragment</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="nx">fragment</span><span class="p">).</span><span class="nx">prev</span><span class="p">(),</span>
</span><span class='line'>        <span class="nx">checkForLast</span> <span class="o">=</span> <span class="nx">nextFragment</span><span class="p">.</span><span class="nx">next</span><span class="p">(),</span>
</span><span class='line'>        <span class="nx">checkForFirst</span> <span class="o">=</span> <span class="nx">fragmentIndex</span> <span class="o">-</span> <span class="mi">2</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">hasSubnav</span> <span class="o">=</span> <span class="nx">currentFragmentedPanel</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="s1">&#39;.fragment-subnav&#39;</span><span class="p">).</span><span class="nx">length</span><span class="p">;</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">hasSubnav</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">activeSubnav</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;.current-panel .fragment-subnav.active&#39;</span><span class="p">),</span>
</span><span class='line'>          <span class="nx">nextSubnav</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;.current-panel .fragment-subnav&#39;</span><span class="p">).</span><span class="nx">get</span><span class="p">(</span><span class="nx">fragmentIndex</span> <span class="o">+</span> <span class="mi">1</span><span class="p">),</span>
</span><span class='line'>          <span class="nx">prevSubnav</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;.current-panel .fragment-subnav&#39;</span><span class="p">).</span><span class="nx">get</span><span class="p">(</span><span class="nx">fragmentIndex</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">movement</span> <span class="o">===</span> <span class="s1">&#39;down&#39;</span> <span class="o">&amp;&amp;</span> <span class="nx">nextFragment</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="nx">checkForLast</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">currentFragmentedParts</span><span class="p">.</span><span class="nx">removeClass</span><span class="p">(</span><span class="s1">&#39;active&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">nextFragment</span><span class="p">.</span><span class="nx">addClass</span><span class="p">(</span><span class="s1">&#39;active&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">currentFragmentedPanel</span><span class="p">.</span><span class="nx">removeClass</span><span class="p">(</span><span class="s1">&#39;first-fragment&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">currentFragmentedPanel</span><span class="p">.</span><span class="nx">removeClass</span><span class="p">(</span><span class="s1">&#39;last-fragment&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">hasSubnav</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">activeSubnav</span><span class="p">.</span><span class="nx">removeClass</span><span class="p">(</span><span class="s1">&#39;active&#39;</span><span class="p">);</span>
</span><span class='line'>          <span class="nx">$</span><span class="p">(</span><span class="nx">nextSubnav</span><span class="p">).</span><span class="nx">addClass</span><span class="p">(</span><span class="s1">&#39;active&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>      <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">currentFragmentedParts</span><span class="p">.</span><span class="nx">removeClass</span><span class="p">(</span><span class="s1">&#39;active&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">nextFragment</span><span class="p">.</span><span class="nx">addClass</span><span class="p">(</span><span class="s1">&#39;active&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">currentFragmentedPanel</span><span class="p">.</span><span class="nx">removeClass</span><span class="p">(</span><span class="s1">&#39;first-fragment&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">currentFragmentedPanel</span><span class="p">.</span><span class="nx">addClass</span><span class="p">(</span><span class="s1">&#39;last-fragment&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">hasSubnav</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">activeSubnav</span><span class="p">.</span><span class="nx">removeClass</span><span class="p">(</span><span class="s1">&#39;active&#39;</span><span class="p">);</span>
</span><span class='line'>          <span class="nx">$</span><span class="p">(</span><span class="nx">nextSubnav</span><span class="p">).</span><span class="nx">addClass</span><span class="p">(</span><span class="s1">&#39;active&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">movement</span> <span class="o">===</span> <span class="s1">&#39;up&#39;</span> <span class="o">&amp;&amp;</span> <span class="nx">prevFragment</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="nx">checkForFirst</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">currentFragmentedParts</span><span class="p">.</span><span class="nx">removeClass</span><span class="p">(</span><span class="s1">&#39;active&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">prevFragment</span><span class="p">.</span><span class="nx">addClass</span><span class="p">(</span><span class="s1">&#39;active&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">currentFragmentedPanel</span><span class="p">.</span><span class="nx">removeClass</span><span class="p">(</span><span class="s1">&#39;first-fragment&#39;</span><span class="p">).</span><span class="nx">removeClass</span><span class="p">(</span><span class="s1">&#39;last-fragment&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">hasSubnav</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">activeSubnav</span><span class="p">.</span><span class="nx">removeClass</span><span class="p">(</span><span class="s1">&#39;active&#39;</span><span class="p">);</span>
</span><span class='line'>          <span class="nx">$</span><span class="p">(</span><span class="nx">prevSubnav</span><span class="p">).</span><span class="nx">addClass</span><span class="p">(</span><span class="s1">&#39;active&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>      <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">currentFragmentedParts</span><span class="p">.</span><span class="nx">removeClass</span><span class="p">(</span><span class="s1">&#39;active&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">prevFragment</span><span class="p">.</span><span class="nx">addClass</span><span class="p">(</span><span class="s1">&#39;active&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">currentFragmentedPanel</span><span class="p">.</span><span class="nx">removeClass</span><span class="p">(</span><span class="s1">&#39;last-fragment&#39;</span><span class="p">).</span><span class="nx">addClass</span><span class="p">(</span><span class="s1">&#39;first-fragment&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">hasSubnav</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">activeSubnav</span><span class="p">.</span><span class="nx">removeClass</span><span class="p">(</span><span class="s1">&#39;active&#39;</span><span class="p">);</span>
</span><span class='line'>          <span class="nx">$</span><span class="p">(</span><span class="nx">prevSubnav</span><span class="p">).</span><span class="nx">addClass</span><span class="p">(</span><span class="s1">&#39;active&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>For the code in your fragmented sections to work, you need to set up your HTML with certain classes. The &lsquo;section&rsquo; will need to get the classes &lsquo;fragmented&rsquo; and &lsquo;first-fragment&rsquo;. The fragments within your fragmented section need to get the class &lsquo;fragmented-part&rsquo;. The subnav items should get the class &lsquo;fragment-subnav&rsquo;. And the first fragment item and first subnav item should always get the &lsquo;active&rsquo; class.
Here&rsquo;s an example of how to set up the HTML:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;section</span> <span class="na">class=</span><span class="s">&quot;fragmented first-fragment&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="c">&lt;!-- this is a slide with fragments --&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;fragmented-part active&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;fragmented-part&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;fragmented-part&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'><span class="nt">&lt;/section&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;section</span> <span class="na">class=</span><span class="s">&quot;fragmented first-fragment&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="c">&lt;!-- this is a slide with fragments and a subnav--&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;fragment-subnav active&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;fragment-subnav&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;fragment-subnav&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;fragmented-part active&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;fragmented-part&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;fragmented-part&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'><span class="nt">&lt;/section&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>A big thing in the fragmentedPanel function is to know when you&rsquo;re reaching the end of the fragmented-parts so you can move on to the next slide. That&rsquo;s why I have the &lsquo;checkForLast&rsquo; and &lsquo;checkForFirst&rsquo; variables. With every movement, I&rsquo;m checking to see if an element exists in the next slot.</p>

<p>Great, now we need to update our slider function to halt movement if we see a &lsquo;fragmented&rsquo; section.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">slider</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">that</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">$</span><span class="p">(</span><span class="nb">document</span><span class="p">).</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;keydown&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">){</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">$currentPanel</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;.currentPanel&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">keyCode</span> <span class="o">===</span> <span class="mi">40</span> <span class="o">||</span> <span class="nx">e</span><span class="p">.</span><span class="nx">keyCode</span> <span class="o">===</span> <span class="mi">32</span> <span class="o">||</span> <span class="nx">e</span><span class="p">.</span><span class="nx">keyCode</span> <span class="o">===</span> <span class="mi">13</span>  <span class="o">||</span> <span class="nx">e</span><span class="p">.</span><span class="nx">keyCode</span> <span class="o">===</span> <span class="mi">34</span> <span class="o">||</span> <span class="nx">e</span><span class="p">.</span><span class="nx">keyCode</span> <span class="o">===</span> <span class="mi">39</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">e</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">();</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="nx">currentPanel</span><span class="p">.</span><span class="nx">hasClass</span><span class="p">(</span><span class="s1">&#39;fragmented&#39;</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="p">(</span><span class="nx">currentPanel</span><span class="p">.</span><span class="nx">hasClass</span><span class="p">(</span><span class="s1">&#39;last-fragment&#39;</span><span class="p">)))</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">that</span><span class="p">.</span><span class="nx">fragmentedPanel</span><span class="p">(</span><span class="s1">&#39;down&#39;</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">that</span><span class="p">.</span><span class="nx">findNext</span><span class="p">();</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">keyCode</span> <span class="o">===</span> <span class="mi">38</span> <span class="o">||</span> <span class="nx">e</span><span class="p">.</span><span class="nx">keyCode</span> <span class="o">===</span> <span class="mi">33</span> <span class="o">||</span> <span class="nx">e</span><span class="p">.</span><span class="nx">keyCode</span> <span class="o">===</span> <span class="mi">37</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">e</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">();</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span> <span class="nx">currentPanel</span><span class="p">.</span><span class="nx">hasClass</span><span class="p">(</span><span class="s1">&#39;fragmented&#39;</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="p">(</span><span class="nx">currentPanel</span><span class="p">.</span><span class="nx">hasClass</span><span class="p">(</span><span class="s1">&#39;first-fragment&#39;</span><span class="p">))</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">that</span><span class="p">.</span><span class="nx">fragmentedPanel</span><span class="p">(</span><span class="s1">&#39;up&#39;</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">that</span><span class="p">.</span><span class="nx">findPrev</span><span class="p">();</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>That&rsquo;s pretty much it. I hope this makes some kind of sense to you. You can take a look at the <a href="https://github.com/ccmeyers/slide-presentation" target="_blank">full code here</a> and a <a href="http://anunexpectedcoder.com/slide-presentation/" target="_blank">demo here</a>.</p>

<p>And in honor of this blog post&rsquo;s title. I leave you with a little Coolio circa 1994.</p>

<iframe width="420" height="315" src="https://www.youtube.com/embed/cbhkuu4e0iw" frameborder="0" allowfullscreen></iframe>

]]></content>
    
  </entry>
  
  <entry>
    
    <title type="html"><![CDATA[Boot it Up, Baby]]></title>
    <link href="http://anunexpectedcoder.com/blog/2014/09/01/starting-a-simple-server/"/>
    
    <updated>2014-09-01T15:00:52-07:00</updated>
    <id>http://anunexpectedcoder.com/blog/2014/09/01/starting-a-simple-server</id>
    
    <content type="html"><![CDATA[<h2>How to Start a Simple Local Server</h2>

<p>Sometimes when building a simple website, it&rsquo;s tempting to check your changes by viewing your file(s) in a browser. But have you ever gotten stuck when some of your more complicated code isn&rsquo;t working even though you KNOW IT SHOULD?!?!?!</p>

<p>Maybe you&rsquo;re getting errors in the console like &ldquo;XMLHttpRequest cannot load file:&hellip; Cross origin requests are only supported for HTTP&rdquo;?</p>

<p>Well, the problem might not be you. It might just be your not running a local server. This happened to me while working with AngularJS&rsquo;s custom directives and to a friend while working with popcorn.js.</p>

<p>&ldquo;But I&rsquo;m not using Rails or Sinatra,&rdquo; you say?</p>

<p>&ldquo;But I can&rsquo;t type &lsquo;shotgun&rsquo; or &lsquo;rails s&rsquo; into my terminal,&rdquo; you declare?</p>

<p>Want to know a trick?</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>brew install python
</span></code></pre></td></tr></table></div></figure>


<p>I know, it feels like you&rsquo;re cheating on Ruby. But, she&rsquo;ll never know, I swear.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>python -m SimpleHTTPServer 8000
</span></code></pre></td></tr></table></div></figure>


<p>Then, just open up <a href="http://localhost:8000/">http://localhost:8000/</a> in your browser, and you&rsquo;ll be on your way!</p>

<p>If your code still doesn&rsquo;t work while on this local server&hellip;it might just be your code. So&hellip;there&rsquo;s that.</p>
]]></content>
    
  </entry>
  
  <entry>
    
    <title type="html"><![CDATA[Zip It, and Zip it Good]]></title>
    <link href="http://anunexpectedcoder.com/blog/2014/08/13/zip-it/"/>
    
    <updated>2014-08-13T16:42:16-07:00</updated>
    <id>http://anunexpectedcoder.com/blog/2014/08/13/zip-it</id>
    
    <content type="html"><![CDATA[<p>Sometimes scraping can be a complete pain when the site you&rsquo;re dealing with is poorly structured. While trying to scrape composers and their respective musical pieces from a site, we ran into a problem because a composer&rsquo;s pieces were not nested within that composer. Enter the ZIP method, the coolest method I had never heard of that I found out about today.</p>

<p>Here&rsquo;s an example of the html structure we were dealing with:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;div</span> <span class="na">lang=</span><span class="s">&quot;en&quot;</span> <span class="na">dir=</span><span class="s">&quot;ltr&quot;</span> <span class="na">class=</span><span class="s">&quot;mw-content-ltr&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;p&gt;&lt;b&gt;</span>Alejandre Prada, Manuel<span class="nt">&lt;/b&gt;&lt;/p&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nt">&lt;dl&gt;</span>
</span><span class='line'>    <span class="nt">&lt;dd&gt;</span>Suite, Op.44<span class="nt">&lt;/dd&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/dl&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nt">&lt;p&gt;&lt;b&gt;</span>Barthe, Adrien<span class="nt">&lt;/b&gt;&lt;/p&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nt">&lt;dl&gt;</span>
</span><span class='line'>    <span class="nt">&lt;dd&gt;</span>Aubade<span class="nt">&lt;/dd&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/dl&gt;</span>
</span><span class='line'><span class="nt">&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>It was easy to grab the composers and pieces seperately:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">composers</span> <span class="o">=</span> <span class="vi">@doc</span><span class="o">.</span><span class="n">css</span><span class="p">(</span><span class="s1">&#39;div.mw-content-ltr p&#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="c1">#=&gt;[#&lt;Nokogiri::XML::Element:0x816eb2a8 name=&quot;p&quot; children=[#&lt;Nokogiri::XML::Element:0x816eb0c8 name=&quot;b&quot; children=[#&lt;Nokogiri::XML::Text:0x816eaee8 &quot;Alejandre Prada, Manuel&quot;&gt;]&gt;, #&lt;Nokogiri::XML::Text:0x816ead44 &quot;\n&quot;&gt;]&gt;, #&lt;Nokogiri::XML::Element:0x816ef894 name=&quot;p&quot; children=[#&lt;Nokogiri::XML::Element:0x816ef6b4 name=&quot;b&quot; children=[#&lt;Nokogiri::XML::Text:0x816ef4d4 &quot;Barthe, Adrien&quot;&gt;]</span>
</span><span class='line'><span class="n">pieces</span> <span class="o">=</span> <span class="vi">@doc</span><span class="o">.</span><span class="n">css</span><span class="p">(</span><span class="s1">&#39;div.mw-content-ltr dl&#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="c1">#=&gt;[#&lt;Nokogiri::XML::Element:0x816eaaec name=&quot;dl&quot; children=[#&lt;Nokogiri::XML::Element:0x816ea90c name=&quot;dd&quot; children=[#&lt;Nokogiri::XML::Text:0x816ea72c &quot; &quot;&gt;, #&lt;Nokogiri::XML::Element:0x816ea678 name=&quot;a&quot; attributes=[#&lt;Nokogiri::XML::Attr:0x816ea614 name=&quot;href&quot; value=&quot;/wiki/Suite,_Op.44_(Alejandre_Prada,_Manuel)&quot;&gt;, #&lt;Nokogiri::XML::Attr:0x816ea600 name=&quot;title&quot; value=&quot;Suite, Op.44 (Alejandre Prada, Manuel)&quot;&gt;, #&lt;Nokogiri::XML::Attr:0x816ea5ec name=&quot;class&quot; value=&quot;mw-redirect&quot;&gt;] children=[#&lt;Nokogiri::XML::Text:0x816efd80 &quot;Suite, Op.44&quot;&gt;]&gt;, #&lt;Nokogiri::XML::Text:0x816efbdc &quot;\n&quot;&gt;]&gt;]&gt;, #&lt;Nokogiri::XML::Element:0x816ef0d8 name=&quot;dl&quot; children=[#&lt;Nokogiri::XML::Element:0x816eeef8 name=&quot;dd&quot; children=[#&lt;Nokogiri::XML::Text:0x816eed18 &quot; &quot;&gt;, #&lt;Nokogiri::XML::Element:0x816eec64 name=&quot;a&quot; attributes=[#&lt;Nokogiri::XML::Attr:0x816eec00 name=&quot;href&quot; value=&quot;/wiki/Aubade_(Barthe,_Adrien)&quot;&gt;, #&lt;Nokogiri::XML::Attr:0x816eebec name=&quot;title&quot; value=&quot;Aubade (Barthe, Adrien)&quot;&gt;] children=[#&lt;Nokogiri::XML::Text:0x816ee5ac &quot;Aubade&quot;&gt;]&gt;, #&lt;Nokogiri::XML::Text:0x816ee408 &quot;\n&quot;&gt;]&gt;]&gt;,</span>
</span></code></pre></td></tr></table></div></figure>


<p>And iterate through them, putting the text into arrays:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">composers_names</span> <span class="o">=</span> <span class="n">composers</span><span class="o">.</span><span class="n">collect</span> <span class="p">{</span><span class="o">|</span><span class="n">e</span><span class="o">|</span><span class="n">e</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)}</span>
</span><span class='line'>  <span class="c1">#=&gt;[&quot;Alejandre Prada, Manuel&quot;, &quot;Barthe, Adrien&quot;]</span>
</span><span class='line'><span class="n">pieces_names</span> <span class="o">=</span> <span class="n">pieces</span><span class="o">.</span><span class="n">collect</span> <span class="p">{</span><span class="o">|</span><span class="n">e</span><span class="o">|</span><span class="n">e</span><span class="o">.</span><span class="n">text</span><span class="p">}</span>
</span><span class='line'>  <span class="c1">#=&gt;[&quot; Suite, Op.44&quot;, &quot; Aubade&quot;]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Then, we had to put these two arrays back together! So&hellip;we zipped &lsquo;em!</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">composers_pieces</span> <span class="o">=</span> <span class="n">composers_names</span><span class="o">.</span><span class="n">zip</span><span class="p">(</span><span class="n">pieces_names</span><span class="p">)</span>
</span><span class='line'>  <span class="c1">#=&gt;[[&quot;Alejandre Prada, Manuel&quot;, &quot; Suite, Op.44&quot;], [&quot;Barthe, Adrien&quot;, &quot; Aubade&quot;]]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Hooray! We now have paired the correct piece with the correct composer. All we had to do then was iterate through our arrays to create hashes: assigning array[0] as the key and array[1..-1] as the value. We needed [1..-1] because sometimes a composer has multiple pieces.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">composers_pieces</span><span class="o">.</span><span class="n">collect</span> <span class="p">{</span><span class="o">|</span><span class="n">array</span><span class="o">|</span> <span class="p">{</span><span class="n">array</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span> <span class="o">=&gt;</span> <span class="n">array</span><span class="o">[</span><span class="mi">1</span><span class="o">.</span><span class="n">.</span><span class="o">-</span><span class="mi">1</span><span class="o">]</span><span class="p">}}</span>
</span><span class='line'>  <span class="c1">#=&gt; [{&quot;Alejandre Prada, Manuel&quot;=&gt;[&quot; Suite, Op.44&quot;]}, {&quot;Barthe, Adrien&quot;=&gt;[&quot; Aubade&quot;]}]</span>
</span></code></pre></td></tr></table></div></figure>


<p>From there it was easy to save the key as the composer and the value as that composer&rsquo;s piece. Thank you to my team members for their help with this today. Shout out to <a href="http://rebeccagreenblatt.github.io/">Rebecca Greenblatt</a> and <a href="http://wlowry88.github.io/">Will Lowry</a>!</p>
]]></content>
    
  </entry>
  
  <entry>
    
    <title type="html"><![CDATA[Premature Ajaxulation]]></title>
    <link href="http://anunexpectedcoder.com/blog/2014/08/09/premature-ajaxulation/"/>
    
    <updated>2014-08-09T21:01:10-07:00</updated>
    <id>http://anunexpectedcoder.com/blog/2014/08/09/premature-ajaxulation</id>
    
    <content type="html"><![CDATA[<h2>Don&rsquo;t worry, it happens to a lot of functions</h2>

<p>Recently, while building an app that used a lot of ajax calls, we kept on running into the problem of an ajax call firing before the function above it finished. Given that the function above provided variables that were necessary in our ajax call, this broke everything.</p>

<p>My team and I scoured the internet (i.e. stack overflow) for an answer, but came up with nothing. We finally asked a Flatiron School TA, and she gave a us a great solution.</p>

<p>We were building an app that calculates the half-way point of a given route. Then, we used the latitude and longitude of that point to search the Yelp API. The ajax call helps us get our javascript variables to the ruby method that directly deals with the API. And, here&rsquo;s what it looks like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">check_done</span> <span class="o">=</span> <span class="s2">&quot;not done&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">getStopPoint</span><span class="p">(</span><span class="nx">response</span><span class="p">,</span> <span class="nx">percentage</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">totalDist</span> <span class="o">=</span> <span class="nx">response</span><span class="p">.</span><span class="nx">routes</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">legs</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">distance</span><span class="p">.</span><span class="nx">value</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">totalTime</span> <span class="o">=</span> <span class="nx">response</span><span class="p">.</span><span class="nx">routes</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">legs</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">duration</span><span class="p">.</span><span class="nx">value</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">distance</span> <span class="o">=</span> <span class="p">(</span><span class="nx">percentage</span><span class="o">/</span><span class="mi">100</span><span class="p">)</span> <span class="o">*</span> <span class="nx">totalDist</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">time</span> <span class="o">=</span> <span class="p">((</span><span class="nx">percentage</span><span class="o">/</span><span class="mi">100</span><span class="p">)</span> <span class="o">*</span> <span class="nx">totalTime</span><span class="o">/</span><span class="mi">60</span><span class="p">).</span><span class="nx">toFixed</span><span class="p">(</span><span class="mi">2</span><span class="p">),</span>
</span><span class='line'>      <span class="nx">polyline</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">google</span><span class="p">.</span><span class="nx">maps</span><span class="p">.</span><span class="nx">Polyline</span><span class="p">({</span>
</span><span class='line'>        <span class="nx">path</span><span class="o">:</span> <span class="p">[],</span>
</span><span class='line'>        <span class="nx">strokeColor</span><span class="o">:</span> <span class="s1">&#39;#FF0000&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">strokeWeight</span><span class="o">:</span> <span class="mi">3</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">bounds</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">google</span><span class="p">.</span><span class="nx">maps</span><span class="p">.</span><span class="nx">LatLngBounds</span><span class="p">();</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">steps</span> <span class="o">=</span> <span class="nx">response</span><span class="p">.</span><span class="nx">routes</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">legs</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">steps</span><span class="p">;</span>
</span><span class='line'>      <span class="k">for</span> <span class="p">(</span><span class="nx">j</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="nx">j</span><span class="o">&lt;</span><span class="nx">steps</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">nextSegment</span> <span class="o">=</span> <span class="nx">steps</span><span class="p">[</span><span class="nx">j</span><span class="p">].</span><span class="nx">path</span><span class="p">;</span>
</span><span class='line'>        <span class="k">for</span> <span class="p">(</span><span class="nx">k</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="nx">k</span><span class="o">&lt;</span><span class="nx">nextSegment</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">k</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">polyline</span><span class="p">.</span><span class="nx">getPath</span><span class="p">().</span><span class="nx">push</span><span class="p">(</span><span class="nx">nextSegment</span><span class="p">[</span><span class="nx">k</span><span class="p">]);</span>
</span><span class='line'>          <span class="nx">bounds</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span><span class="nx">nextSegment</span><span class="p">[</span><span class="nx">k</span><span class="p">]);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="nx">stopPointLatLonObject</span> <span class="o">=</span> <span class="nx">polyline</span><span class="p">.</span><span class="nx">GetPointAtDistance</span><span class="p">(</span><span class="nx">distance</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">placeMarker</span><span class="p">(</span><span class="nx">stopPointLatLonObject</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">stopPointLat</span> <span class="o">=</span> <span class="nx">stopPointLatLonObject</span><span class="p">[</span><span class="s2">&quot;d&quot;</span><span class="p">];</span>
</span><span class='line'>  <span class="nx">stopPointLon</span> <span class="o">=</span> <span class="nx">stopPointLatLonObject</span><span class="p">[</span><span class="s2">&quot;e&quot;</span><span class="p">];</span>
</span><span class='line'>  <span class="nx">check_done</span> <span class="o">=</span> <span class="s2">&quot;done&quot;</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">check</span><span class="p">(){</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nx">check_done</span> <span class="o">===</span> <span class="s2">&quot;done&quot;</span><span class="p">){</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">.</span><span class="nx">ajax</span><span class="p">({</span>
</span><span class='line'>       <span class="nx">url</span><span class="o">:</span><span class="s1">&#39;/restaurants/yelp_search&#39;</span><span class="p">,</span>
</span><span class='line'>       <span class="nx">type</span><span class="o">:</span> <span class="s1">&#39;POST&#39;</span><span class="p">,</span>
</span><span class='line'>       <span class="nx">data</span><span class="o">:</span><span class="p">(</span>
</span><span class='line'>         <span class="s1">&#39;lat=&#39;</span> <span class="o">+</span> <span class="nx">stopPointLat</span> <span class="o">+</span> <span class="s1">&#39;&amp;&#39;</span> <span class="o">+</span>
</span><span class='line'>         <span class="s1">&#39;lon=&#39;</span> <span class="o">+</span> <span class="nx">stopPointLon</span> <span class="o">+</span> <span class="s1">&#39;&amp;&#39;</span> <span class="o">+</span>
</span><span class='line'>         <span class="s1">&#39;type=&#39;</span> <span class="o">+</span> <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#type&quot;</span><span class="p">).</span><span class="nx">val</span><span class="p">()</span> <span class="o">+</span> <span class="s1">&#39;&amp;&#39;</span> <span class="o">+</span>
</span><span class='line'>         <span class="s1">&#39;sort=&#39;</span> <span class="o">+</span> <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#sort&quot;</span><span class="p">).</span><span class="nx">val</span><span class="p">()</span> <span class="o">+</span> <span class="s1">&#39;&amp;&#39;</span> <span class="o">+</span>
</span><span class='line'>         <span class="s1">&#39;mtd=&#39;</span> <span class="o">+</span> <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#mtd&quot;</span><span class="p">).</span><span class="nx">val</span><span class="p">()</span>
</span><span class='line'>       <span class="p">)</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">setTimeout</span><span class="p">(</span><span class="nx">check</span><span class="p">,</span> <span class="mi">1000</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The getStopPoint function goes through the polyline (we&rsquo;re dealing with the lovely Google Maps API here) and finds the stopping point. The most important part of the getStopPoint function is where we define our stopPointLat and stopPointLon variables. Those are the lat/lng coordinates we&rsquo;re going to send to the Yelp API via the ajax call. But, alas, alack! All is going to break if the ajax train leaves the station without its lat/lng coordinates!</p>

<p>How we went about fixing this was by using a check_done variable that is set to &ldquo;not done&rdquo; when it is defined. It only changes to &ldquo;done&rdquo; once stopPointLat and stopPointLon have their values. We use an if/else statement inside the check function to make sure that check_done === &ldquo;done&rdquo; before we send off our ajax call. Else, we setTimeout and run the check function all over again.</p>

<p>I hope that helps anyone out there who might have this problem!</p>
]]></content>
    
  </entry>
  
  <entry>
    
    <title type="html"><![CDATA[Iterators Schmiterators]]></title>
    <link href="http://anunexpectedcoder.com/blog/2014/06/25/iterators-schmiterators/"/>
    
    <updated>2014-06-25T12:32:49-07:00</updated>
    <id>http://anunexpectedcoder.com/blog/2014/06/25/iterators-schmiterators</id>
    
    <content type="html"><![CDATA[<h2>Choosing Between Each, Map, Collect, Select, or Detect</h2>

<p>Sometimes it can be confusing for a ruby newbie to know what method to use when iterating over an array or hash. Most tutorials focus on the each method like a prized first child and then gloss over the others. That can leave a lot of newbies writing extra code trying to make the each method work when they could use a different iterator with more ease.</p>

<p>The easiest way to decide which iterator to use is to ask yourself a few questions about the block of code you are passing in your iteration.</p>

<p><img class="center" src="http://anunexpectedcoder.com/images/Iterator_Tree.jpg" width="750" height="750" title="Iterator Tree" alt="Iterator Tree"></p>

<p>The first question is, &ldquo;Are you &lsquo;puts&#8217;ing elements?&rdquo; For that, you would want to use &#8216;each&rsquo; so that you can simply puts without altering the original array.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">array</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="o">]</span>
</span><span class='line'><span class="n">array</span><span class="o">.</span><span class="n">each</span> <span class="p">{</span> <span class="o">|</span><span class="n">n</span><span class="o">|</span> <span class="nb">puts</span> <span class="s2">&quot;The number is </span><span class="si">#{</span><span class="n">n</span><span class="si">}</span><span class="s2">.&quot;</span><span class="p">}</span>
</span><span class='line'>  <span class="c1">#=&gt; The number is 1.</span>
</span><span class='line'>  <span class="c1">#   The number is 2.</span>
</span><span class='line'>  <span class="c1">#   The number is 3.</span>
</span><span class='line'>  <span class="c1">#   The number is 4.</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you aren&rsquo;t &lsquo;puts&#8217;ing elements, you need to ask, &ldquo;Do you want to pass each element through the block and then return a new array or hash?&rdquo; The key words here are &#8216;return a new array or hash&rsquo;. The &lsquo;each&rsquo; method won&rsquo;t do that. It will just return the old array or hash no matter what you do with the elements in the block. If you know you want to create a new array or hash, you have to then ask, &ldquo;Are you only evaluating truthiness?&rdquo; If you are, &lsquo;select&rsquo; or &lsquo;detect&rsquo; are the way to go.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">array</span><span class="o">.</span><span class="n">select</span> <span class="p">{</span> <span class="o">|</span><span class="n">n</span><span class="o">|</span> <span class="n">n</span><span class="o">.</span><span class="n">odd?</span> <span class="p">}</span>
</span><span class='line'>  <span class="c1">#=&gt; [1,3]</span>
</span><span class='line'><span class="n">array</span><span class="o">.</span><span class="n">detect</span> <span class="p">{</span> <span class="o">|</span><span class="n">n</span><span class="o">|</span> <span class="n">n</span><span class="o">.</span><span class="n">odd?</span> <span class="p">}</span>
</span><span class='line'>  <span class="c1">#=&gt; 1</span>
</span></code></pre></td></tr></table></div></figure>


<p>&lsquo;Select&rsquo; will return an array of all the elements that evaluate to true, while &lsquo;detect&rsquo; will return only the first element that evaluates to true.</p>

<p>If you want to create a new array or hash AND you are doing something other than evaluating truthiness, you&rsquo;ll want to use &lsquo;map&rsquo; or &lsquo;collect&rsquo;. These two do the same thing. The only differences being: you have four less characters to type with &lsquo;map&rsquo;, but &lsquo;collect&rsquo; describes a bit better what you are actually doing. Choose as you will.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">array</span><span class="o">.</span><span class="n">collect</span> <span class="p">{</span> <span class="o">|</span><span class="n">n</span><span class="o">|</span> <span class="n">n</span><span class="o">*</span><span class="mi">10</span> <span class="p">}</span>
</span><span class='line'>  <span class="c1">#=&gt; [10, 20, 30, 40] </span>
</span></code></pre></td></tr></table></div></figure>


<p>One piece of advice: beware of sandwich coding. This happens if you are trying to use &lsquo;each&rsquo; where you want to use &lsquo;map&rsquo;/&lsquo;collect&rsquo;.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">new_array</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'><span class="n">array</span><span class="o">.</span><span class="n">each</span> <span class="p">{</span> <span class="o">|</span><span class="n">n</span><span class="o">|</span> <span class="n">new_array</span> <span class="o">&lt;&lt;</span> <span class="n">n</span><span class="o">*</span><span class="mi">10</span> <span class="p">}</span>
</span><span class='line'><span class="n">new_array</span>
</span><span class='line'>  <span class="c1">#=&gt; [10, 20, 30, 40]</span>
</span></code></pre></td></tr></table></div></figure>


<p>You see how I had to add two extra lines to set up the variable as an empty array and then call the variable after the code was passed? Those lines are the bread to the &lsquo;each&rsquo; meat. Avoid this. Even if you love sandwiches. I love sandwiches.</p>
]]></content>
    
  </entry>
  
  <entry>
    
    <title type="html"><![CDATA[The Surprising Accessibility of Coding]]></title>
    <link href="http://anunexpectedcoder.com/blog/2014/06/11/first-post-6-dot-11-dot-14/"/>
    
    <updated>2014-06-11T20:44:16-07:00</updated>
    <id>http://anunexpectedcoder.com/blog/2014/06/11/first-post-6-dot-11-dot-14</id>
    
    <content type="html"><![CDATA[<p>If you had come up to me a year ago and told me that I would become a web developer, I would have laughed in your face…hard. But here I am, after having a career as a professional opera singer, learning Ruby, a back-end web programming language used to develop some pretty complex web applications. And I’m actually liking it.</p>

<p>
Like many, when I thought of programming, a stereo-type came to mind: one of a socially awkward loner whose brain works at lightning speed and is most likely a genius at math. And when I decided to switch careers at 30, I never thought of coding as a possibility. I was after all, coming from the world of opera. Opera singer turned coder? Ha! But then, at the urging of multiple friends, I decided to give it a chance. 
</p>


<p>
What I discovered was that I was completely wrong about coding. It isn’t just for rocket-scientists and math geniuses. Not to say it isn’t hard. It is. I’m working my ass off. But I found it isn’t this unachievable thing that only people very far-removed from me can accomplish.
</p>


<p>
I quickly discovered, that I already had skills that are applicable to coding. Programming languages are just that, languages. And more and more, these languages are being developed to mimic the english language. Ruby is a great example of this. Want the word “Hello” to appear on your computer screen? Code in “puts ‘Hello’”. That makes a lot more sense than you thought it would, doesn’t it? Of course, it gets way more complicated than that. But it’s a great example of how learning a programming language is just learning new vocabulary within a new syntax. Anyone who has spent time learning a foreign language, already has experience with this. 
</p>


<p>
I was also surprised by the creativity involved in coding. It isn’t just writing a bunch of zeros and ones that will sit on a server all alone like a chubby girl at a school dance. It’s building something that will speak to the world and could even change someone’s life…or just let them buy shoes, which is also cool. There are a million different ways, especially in Ruby, that allow you to code the same thing. You have a lot more freedom than you think and this is where you can let your creativity flow.
</p>


<p>
In the future, most of my blog posts will be more technical, focusing on specific aspects of Ruby and coding in general. But I thought it was so important to address this huge misconception the majority of humanity has when it comes to this profession. I urge you take a stab at it. Try your hand at HTML at <a href="http://code.org">code.org</a> or <a href="http://www.codecademy.com">codecademy</a>. Or, if you are an experienced coder who wants to help make coding more accessible to more people, volunteer for such non-profits as <a href="http://girlswhocode.com">Girls Who Code</a> or <a href="http://www.coderdojonyc.com">CoderDojo NYC</a> and help spread the code.
</p>

]]></content>
    
  </entry>
  
</feed>