Skip to content

Commit

Permalink
Add Jekyll blog and first post.
Browse files Browse the repository at this point in the history
  • Loading branch information
joshcartme committed Jul 24, 2015
1 parent 06aa566 commit edc8cff
Show file tree
Hide file tree
Showing 18 changed files with 897 additions and 1 deletion.
4 changes: 4 additions & 0 deletions .gitignore
@@ -0,0 +1,4 @@
_site
.sass-cache
GEMFILE
Gemfile.lock
13 changes: 13 additions & 0 deletions _config.yml
@@ -0,0 +1,13 @@
# Site settings
title: Josh Cartmell
email: chat@joshc.io
description: > # this means to ignore newlines until "baseurl:"
Python, Django, Mezzanine, Javascript.
baseurl: "" # the subpath of your site, e.g. /blog/
url: "https://joshc.io" # the base hostname & protocol for your site
twitter_username: joshcartme
github_username: joshcartme
highlighter: pygments

# Build settings
markdown: kramdown
55 changes: 55 additions & 0 deletions _includes/footer.html
@@ -0,0 +1,55 @@
<footer class="site-footer">

<div class="wrapper">

<h2 class="footer-heading">{{ site.title }}</h2>

<div class="footer-col-wrapper">
<div class="footer-col footer-col-1">
<ul class="contact-list">
<li>{{ site.title }}</li>
<li><a href="mailto:{{ site.email }}">{{ site.email }}</a></li>
</ul>
</div>

<div class="footer-col footer-col-2">
<ul class="social-media-list">
{% if site.github_username %}
<li>
<a href="https://github.com/{{ site.github_username }}">
<span class="icon icon--github">
<svg viewBox="0 0 16 16">
<path fill="#828282" d="M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761 c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32 c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472 c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037 C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65 c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261 c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082 c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129 c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z"/>
</svg>
</span>

<span class="username">{{ site.github_username }}</span>
</a>
</li>
{% endif %}

{% if site.twitter_username %}
<li>
<a href="https://twitter.com/{{ site.twitter_username }}">
<span class="icon icon--twitter">
<svg viewBox="0 0 16 16">
<path fill="#828282" d="M15.969,3.058c-0.586,0.26-1.217,0.436-1.878,0.515c0.675-0.405,1.194-1.045,1.438-1.809
c-0.632,0.375-1.332,0.647-2.076,0.793c-0.596-0.636-1.446-1.033-2.387-1.033c-1.806,0-3.27,1.464-3.27,3.27 c0,0.256,0.029,0.506,0.085,0.745C5.163,5.404,2.753,4.102,1.14,2.124C0.859,2.607,0.698,3.168,0.698,3.767 c0,1.134,0.577,2.135,1.455,2.722C1.616,6.472,1.112,6.325,0.671,6.08c0,0.014,0,0.027,0,0.041c0,1.584,1.127,2.906,2.623,3.206 C3.02,9.402,2.731,9.442,2.433,9.442c-0.211,0-0.416-0.021-0.615-0.059c0.416,1.299,1.624,2.245,3.055,2.271 c-1.119,0.877-2.529,1.4-4.061,1.4c-0.264,0-0.524-0.015-0.78-0.046c1.447,0.928,3.166,1.469,5.013,1.469 c6.015,0,9.304-4.983,9.304-9.304c0-0.142-0.003-0.283-0.009-0.423C14.976,4.29,15.531,3.714,15.969,3.058z"/>
</svg>
</span>

<span class="username">{{ site.twitter_username }}</span>
</a>
</li>
{% endif %}
</ul>
</div>

<div class="footer-col footer-col-3">
<p class="text">{{ site.description }}</p>
</div>
</div>

</div>

</footer>
11 changes: 11 additions & 0 deletions _includes/head.html
@@ -0,0 +1,11 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width initial-scale=1" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">

<title>{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}</title>
<meta name="description" content="{{ site.description }}">

<link rel="stylesheet" href="{{ "/css/main.css" | prepend: site.baseurl }}">
<link rel="canonical" href="{{ page.url | replace:'index.html','' | prepend: site.baseurl | prepend: site.url }}">
</head>
27 changes: 27 additions & 0 deletions _includes/header.html
@@ -0,0 +1,27 @@
<header class="site-header">

<div class="wrapper">

<a class="site-title" href="{{ site.baseurl }}/">{{ site.title }}</a>

<nav class="site-nav">
<a href="#" class="menu-icon">
<svg viewBox="0 0 18 15">
<path fill="#424242" d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.031C17.335,0,18,0.665,18,1.484L18,1.484z"/>
<path fill="#424242" d="M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0c0-0.82,0.665-1.484,1.484-1.484 h15.031C17.335,6.031,18,6.696,18,7.516L18,7.516z"/>
<path fill="#424242" d="M18,13.516C18,14.335,17.335,15,16.516,15H1.484C0.665,15,0,14.335,0,13.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.031C17.335,12.031,18,12.696,18,13.516L18,13.516z"/>
</svg>
</a>

<div class="trigger">
{% for page in site.pages %}
{% if page.title %}
<a class="page-link" href="{{ page.url | prepend: site.baseurl }}">{{ page.title }}</a>
{% endif %}
{% endfor %}
</div>
</nav>

</div>

</header>
20 changes: 20 additions & 0 deletions _layouts/default.html
@@ -0,0 +1,20 @@
<!DOCTYPE html>
<html>

{% include head.html %}

<body>

{% include header.html %}

<div class="page-content">
<div class="wrapper">
{{ content }}
</div>
</div>

{% include footer.html %}

</body>

</html>
14 changes: 14 additions & 0 deletions _layouts/page.html
@@ -0,0 +1,14 @@
---
layout: default
---
<div class="post">

<header class="post-header">
<h1 class="post-title">{{ page.title }}</h1>
</header>

<article class="post-content">
{{ content }}
</article>

</div>
34 changes: 34 additions & 0 deletions _layouts/post.html
@@ -0,0 +1,34 @@
---
layout: default
comments: true
---
<div class="post">

<header class="post-header">
<h1 class="post-title">{{ page.title }}</h1>
<p class="post-meta">{{ page.date | date: "%b %-d, %Y" }}{% if page.author %} • {{ page.author }}{% endif %}{% if page.meta %} • {{ page.meta }}{% endif %}</p>
</header>

<article class="post-content">
{{ content }}
</article>

{% if page.comments %}
<div id="disqus_thread"></div>
<script type="text/javascript">
/* * * CONFIGURATION VARIABLES * * */
var disqus_shortname = 'bitofpixels';
var disqus_identifier = 'joshc.io - {{ page.date | date_to_string }}';
var disqus_title = '{{ page.title }}';

/* * * DON'T EDIT BELOW THIS LINE * * */
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript" rel="nofollow">comments powered by Disqus.</a></noscript>
{% endif %}

</div>
107 changes: 107 additions & 0 deletions _posts/2015-07-24-no-else-return-can-be-harmful.md
@@ -0,0 +1,107 @@
---
layout: post
title: no-else-return can be harmful
date: 2015-07-23 19:25:28
categories: javascript eslint
---

### Consider:

{% highlight js %}

function elseAfterReturn(someCondition, otherCondition){
if(someCondition){
console.log('if');
} else if (otherCondition){
console.log('else if');
return;
} else{
// eslint complains no else after return
console.log('else');
}
// do something after if or else, but not else if
return;
}

function noElseAfterReturn(someCondition, otherCondition){
if(someCondition){
console.log('if');
} else if (otherCondition){
console.log('else if');
return;
}
console.log('else');
// do something after if or the supposedly implicit else, but not else if
return;
}

console.log('else after return');
elseAfterReturn(true, false);

console.log();

console.log('no else after return');
noElseAfterReturn(true, false);
{% endhighlight %}

The output from the two functions is not the same, but don't take my word for it.

<button id="run-script">Run the script!</button>

<pre><code id="script-output"></code></pre>

*I modified the script slightly to print to this code block instead of the console*

eslint might lead you to believe that the two functions above are identical, but they clearly are not.

Obviously the above is very contrived, but this actually bit me while using expressjs. I had a situation where I accidentally called `next()` more than once in some cases which resulted in erratic and difficult to track down errors.

This probably could be solved with better coding practices, but I think it's worth realizing that `no-else-return` can introduce unexpected errors.

<script>
(function() {
var output = {
element: document.getElementById('script-output'),
log: function(text){
output.element.innerHTML += text + '\n';
}
};
function elseAfterReturn(someCondition, otherCondition){
if(someCondition){
output.log('if');
} else if (otherCondition){
output.log('else if');
return;
} else{
// eslint complains no else after return
output.log('else');
}
// do something after if or else, but not else if
return;
}

function noElseAfterReturn(someCondition, otherCondition){
if(someCondition){
output.log('if');
} else if (otherCondition){
output.log('else if');
return;
}
output.log('else');
// do something after if or the supposedly implicit else, but not else if
return;
}


document.getElementById('run-script').addEventListener('click', function(){
output.log('else after return');
elseAfterReturn(true, false);

output.log('');

output.log('no else after return');
noElseAfterReturn(true, false);
});
}());

</script>

0 comments on commit edc8cff

Please sign in to comment.