Skip to content

Instantly share code, notes, and snippets.

@mchelen
Last active March 14, 2020 01:32
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save mchelen/101a42c2e433051b3f68 to your computer and use it in GitHub Desktop.
Save mchelen/101a42c2e433051b3f68 to your computer and use it in GitHub Desktop.
JSON Resume Browser Example
body {
background: #fff;
font: 15px Arial, Helvetica, sans-serif;
line-height: 1.4;
margin: 50px 0;
margin-bottom: 100px;
}
em {
color: #999;
}
p {
line-height: 1.4;
}
ul {
margin-bottom: 0;
}
section {
margin-bottom: 2em;
}
blockquote {
margin: 0;
margin-bottom: 1em;
}
.item {
margin-bottom: 1em;
}
#resume {
margin: 0 auto;
max-width: 480px;
padding: 0 20px;
}
#basics {
margin-bottom: -10px;
}
#basics h3 {
margin-top: 1.5em;
}
#basics .contact strong,
#location strong {
clear: both;
float: left;
line-height: 1.3;
width: 120px;
}
#profiles,
#skills {
overflow: hidden;
}
#profiles .item,
#skills .item {
float: left;
width: 50%;
}
<div id="resume">
{{#resume.basics}}
<h1>{{name}}</h1>
<h2>{{label}}</h2>
<section id="basics">
<div class="contact">
{{#if website}}
<div class="website">
<strong>Website</strong>
{{website}}
</div>
{{/if}}
{{#if email}}
<div class="email">
<strong>Email</strong>
{{email}}
</div>
{{/if}}
{{#if phone}}
<div class="phone">
<strong>Phone</strong>
{{phone}}
</div>
{{/if}}
</div>
{{#if summary}}
<div class="summary">
<p>{{summary}}</p>
</div>
{{/if}}
{{#location}}
<h3>Location</h3>
<section id="location">
{{#if address}}
<div class="address">
<strong>Address</strong>
{{address}}
</div>
{{/if}}
{{#if postalCode}}
<div class="postalCode">
<strong>Postal code</strong>
{{postalCode}}
</div>
{{/if}}
{{#if city}}
<div class="city">
<strong>City</strong>
{{city}}
</div>
{{/if}}
{{#if countryCode}}
<div class="countryCode">
<strong>Country code</strong>
{{countryCode}}
</div>
{{/if}}
{{#if region}}
<div class="region">
<strong>Region</strong>
{{region}}
</div>
{{/if}}
</section>
{{/location}}
{{#if profiles.length}}
<h3>Profiles</h3>
<section id="profiles">
{{#each profiles}}
<div class="item">
{{#if network}}
<strong class="network">
{{network}}
</strong>
{{/if}}
{{#if username}}
<div class="username">
{{username}}
</div>
{{/if}}
{{#if url}}
<div class="url">
<a href="{{url}}">Link</a>
</div>
{{/if}}
</div>
{{/each}}
</section>
{{/if}}
</section>
{{/resume.basics}}
{{#if resume.work.length}}
<section id="work">
<h2>Work</h2>
{{#each resume.work}}
<div class="item">
{{#if company}}
<h3 class="name">
{{company}}
</h3>
{{/if}}
<div class="date">
{{#if startDate}}
<span class="startDate">
{{startDate}}
</span>
{{/if}}
{{#if endDate}}
<span class="endDate">
- {{endDate}}
</span>
{{else}}
<span class="endDate">
- Present
</span>
{{/if}}
</div>
{{#if position}}
<div class="position">
{{position}}
</div>
{{/if}}
{{#if website}}
<div class="website">
<a href="{{website}}">{{website}}</a>
</div>
{{/if}}
{{#if summary}}
<div class="summary">
<p>{{summary}}</p>
</div>
{{/if}}
{{#if highlights.length}}
<ul class="highlights">
{{#each highlights}}
<li>{{.}}</li>
{{/each}}
</ul>
{{/if}}
</div>
{{/each}}
</section>
{{/if}}
{{#if resume.volunteer.length}}
<section id="volunteer">
<h2>Volunteer</h2>
{{#each resume.volunteer}}
<div class="item">
{{#if organization}}
<h3 class="company">
{{organization}}
</h3>
{{/if}}
<div class="date">
{{#if startDate}}
<span class="startDate">
{{startDate}}
</span>
{{/if}}
{{#if endDate}}
<span class="endDate">
- {{endDate}}
</span>
{{else}}
<span class="endDate">
- Present
</span>
{{/if}}
</div>
{{#if position}}
<div class="position">
{{position}}
</div>
{{/if}}
{{#if website}}
<div class="website">
<a href="{{website}}">{{website}}</a>
</div>
{{/if}}
{{#if summary}}
<div class="summary">
<p>{{summary}}</p>
</div>
{{/if}}
{{#if highlights.length}}
<ul class="highlights">
{{#each highlights}}
<li>{{.}}</li>
{{/each}}
</ul>
{{/if}}
</div>
{{/each}}
</section>
{{/if}}
{{#if resume.education.length}}
<section id="education">
<h2>Education</h2>
{{#each resume.education}}
<div class="item">
<div class="date">
{{#if startDate}}
<span class="startDate">
{{startDate}}
</span>
{{/if}}
{{#if endDate}}
<span class="endDate">
- {{endDate}}
</span>
{{else}}
<span class="endDate">
- Present
</span>
{{/if}}
</div>
{{#if institution}}
<div class="institution">
{{institution}}
</div>
{{/if}}
{{#if area}}
<div class="area">
{{area}}
</div>
{{/if}}
{{#if studyType}}
<div class="studyType">
{{studyType}}
</div>
{{/if}}
{{#if gpa}}
<div class="gpa">
GPA: {{gpa}}
</div>
{{/if}}
{{#if courses.length}}
<ul class="courses">
{{#each courses}}
<li>{{.}}</li>
{{/each}}
</ul>
{{/if}}
</div>
{{/each}}
</section>
{{/if}}
{{#if resume.awards.length}}
<section id="awards">
<h2>Awards</h2>
{{#each resume.awards}}
<div class="item">
{{#if title}}
<div class="title">
{{title}}
</div>
{{/if}}
{{#if date}}
<div class="date">
{{date}}
</div>
{{/if}}
{{#if awarder}}
<div class="awarder">
{{awarder}}
</div>
{{/if}}
{{#if summary}}
<div class="summary">
<p>{{summary}}</p>
</div>
{{/if}}
</div>
{{/each}}
</section>
{{/if}}
{{#if resume.publications.length}}
<section id="publications">
<h2>Publications</h2>
{{#each resume.publications}}
<div class="item">
{{#if name}}
<div class="name">
{{name}}
</div>
{{/if}}
{{#if publisher}}
<div class="publisher">
{{publisher}}
</div>
{{/if}}
{{#if releaseDate}}
<div class="releaseDate">
{{releaseDate}}
</div>
{{/if}}
{{#if website}}
<div class="website">
<a href="{{website}}">Link</a>
</div>
{{/if}}
{{#if summary}}
<div class="summary">
<p>{{summary}}</p>
</div>
{{/if}}
</div>
{{/each}}
</section>
{{/if}}
{{#if resume.skills.length}}
<section id="skills">
<h2>Skills</h2>
{{#each resume.skills}}
<div class="item">
{{#if name}}
<div class="name">
{{name}}
</div>
{{/if}}
{{#if level}}
<div class="level">
<em>{{level}}</em>
</div>
{{/if}}
{{#if keywords.length}}
<ul class="keywords">
{{#each keywords}}
<li>{{.}}</li>
{{/each}}
</ul>
{{/if}}
</div>
{{/each}}
</section>
{{/if}}
{{#if resume.languages.length}}
<section id="languages">
<h2>Languages</h2>
{{#each resume.languages}}
<div class="item">
{{#if language}}
<div class="language">
{{language}}
</div>
{{/if}}
{{#if fluency}}
<div class="fluency">
<em>{{fluency}}</em>
</div>
{{/if}}
</div>
{{/each}}
</section>
{{/if}}
{{#if resume.interests.length}}
<section id="interests">
<h2>Interests</h2>
{{#each resume.interests}}
<div class="item">
{{#if name}}
<div class="name">
{{name}}
</div>
{{/if}}
{{#if keywords.length}}
<ul class="keywords">
{{#each keywords}}
<li>{{.}}</li>
{{/each}}
</ul>
{{/if}}
</div>
{{/each}}
</section>
{{/if}}
{{#if resume.references.length}}
<section id="references">
<h2>References</h2>
{{#each resume.references}}
<div class="item">
{{#if reference}}
<blockquote class="reference">
{{reference}}
</blockquote>
{{/if}}
{{#if name}}
<div class="name">
— {{name}}
</div>
{{/if}}
</div>
{{/each}}
</section>
{{/if}}
</div>
<!DOCTYPE HTML>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
<title>jQuery AutoBars Example</title>
<link rel="stylesheet" href="boilerplate.css">
<script src="https://code.jquery.com/jquery-2.1.1.min.js" type="text/javascript"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/handlebars.js/2.0.0/handlebars.min.js" type="text/javascript" charset="utf-8"></script>
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
<script src="jquery-autobars.js" type="text/javascript"></script>
<script src="boilerplate.hbs" type="text/x-handlebars-template"></script>
<script type="text/javascript">
$(document).ready(function() {
$(document).autoBars(function() {
$.getJSON("resume.json", function(json) {
var data = { "resume" : json};
var $html = $.handlebarTemplates['boilerplate'](data);
$('body').append($html);
})
.fail(function(jqxhr, textStatus, error) {
var err = textStatus + ", " + error;
console.log( "Request Failed: " + err );
});
});
})
</script>
</head>
<body>
</body>
/*global Handlebars */
/*global jQuery */
/*
* this file is a basic helper utility for people
* using handlebars.js. it allowes you to store several
* handlebars templates seperated with
*
* <!--#?templateid-->
*
*
* <!--#?end-->
*
* Created by Peter de Croos (Cultofmetatron)
* blog.peterdecroos.com
*/
(function($) {
'use strict';
var methods;
methods = {
initialize: function () {},
parseName: function (url) {
var splitName, splitUrl, name;
splitUrl = url.split('/');
//get everything past the last slash
name = splitUrl[splitUrl.length - 1];
//strip querystring
name = name.split('?')[0];
splitName = name.split('.');
if (splitName.length > 1) {
//strip extension
splitName = splitName.slice(0, -1);
}
return splitName.join('.');
},
parsePartials: function (data) {
var endToken, separatorToken, END_TOKEN_SIZE,
templates;
//first we seperate the strings with a regular expression
separatorToken = /<!--#\?[a-zA-Z]+-->/; //matches the headers
endToken = /<!--#\?end-->/;
END_TOKEN_SIZE = 12;
templates = {};
// now we get the names of the partials
// first remove all white space characters that are in groups > 2
data = data.split('\n').join('').split(/\s{2,}/).join('');
// now that we have a whitespace stripped version,
// we loop through chunking them.
// get the first token and extract the key
while (data.match(separatorToken)) {
var token = data.match(separatorToken)[0]; //gets the first token
var name = token.match(/[a-zA-Z]+/)[0];//the name we get token
data = data.slice(token.length);
// feed in characters till you get to the end tag.
var endIndex = data.search(endToken);
var source = data.slice(0, endIndex);
// increment to the next size;
data = data.slice(endIndex + END_TOKEN_SIZE);
templates[name] = Handlebars.compile(source);
}
// register partials for use within Handlebars templates
// for usage, see https://github.com/wycats/handlebars.js/#partials
for (var key in templates) {
if (Object.prototype.hasOwnProperty.call(templates, key)) {
methods.registerPartial(key, templates[key]);
}
}
},
registerPartial: function (key, partial) {
Handlebars.registerPartial(key, partial);
},
mainTemplates: function (context) {
var pipe = [];//promise objects
context.find('[type="text/x-handlebars-template"]')
.each(function (index, element) {
var loadUrl = $(element).attr('src');
//var name = loadUrl.match(/([^\/]+)(?=\.\w+$)/)[0];
var name = methods.parseName(loadUrl);
//here we gather all our promises
pipe.push(
$.ajax({
url: loadUrl,
dataType: 'text'
}).done(function (data) {
jQuery.handlebarTemplates[name] = Handlebars.compile(data);
})
);
});
return pipe;
},
partials: function (context) {
//we take the nodes and pull out partials
var pipe = [];//promise objects
context.find('[type="text/x-handlebars-partial"]')
.each(function (index, element) {
//handlebarTemplates = Handlebars.compile($(element).html());
var loadUrl = $(element).attr('src');
//gather the promises
pipe.push(
$.ajax({
url: loadUrl,
dataType: 'text'
}).done(function (data) {
//each pageload is performed asynchronously and so the data exists only in this
//context. here we scrub the input and use it;
methods.parsePartials(data);
})
);
});
return pipe;
}
};
$.fn.autoBars = function(options, callback) {
var args = Array.prototype.slice.call(arguments, 0);
if (args.length === 1 && typeof(args[0]) === 'function') {
//checks if there's only one argument and sets the
// callback to be the first
callback = options;
options = {};
}
//so we don't overwrite it
jQuery.handlebarTemplates = jQuery.handlebarTemplates || {};
jQuery.handlebarTemplates.partials =
jQuery.handlebarTemplates.partials || {};
var settings = $.extend({
loadHandlebars : false,
}, options);
// gather all the promises from the multiple async calls
var partialPromises = methods.partials(this);
var templatesPromises = methods.mainTemplates(this);
var promises = partialPromises.concat(templatesPromises);
// we delay execution of the callback until all
// the promises are fulfilled!!
if (typeof(callback) === 'function') {
$.when.apply(this, promises).done(callback);
}
// return the original jquery object
return this;
};
})(jQuery);
{
"basics": {
"name": "Richard Hendriks",
"label": "Programmer",
"picture": "",
"email": "richard.hendriks@gmail.com",
"phone": "(912) 555-4321",
"website": "http://richardhendricks.com",
"summary": "Richard hails from Tulsa. He has earned degrees from the University of Oklahoma and Stanford. (Go Sooners and Cardinals!) Before starting Pied Piper, he worked for Hooli as a part time software developer. While his work focuses on applied information theory, mostly optimizing lossless compression schema of both the length-limited and adaptive variants, his non-work interests range widely, everything from quantum computing to chaos theory. He could tell you about it, but THAT would NOT be a “length-limited” conversation!",
"location": {
"address": "2712 Broadway St",
"postalCode": "CA 94115",
"city": "San Francisco",
"countryCode": "US",
"region": "California"
},
"profiles": [
{
"network": "Twitter",
"username": "neutralthoughts",
"url": ""
},
{
"network": "SoundCloud",
"username": "dandymusicnl",
"url": "https://soundcloud.com/dandymusicnl"
}
]
},
"work": [
{
"company": "Pied Piper",
"position": "CEO/President",
"website": "http://piedpiper.com",
"startDate": "2013-12-01",
"endDate": "2014-12-01",
"summary": "Pied Piper is a multi-platform technology based on a proprietary universal compression algorithm that has consistently fielded high Weisman Scores™ that are not merely competitive, but approach the theoretical limit of lossless compression.",
"highlights": [
"Build an algorithm for artist to detect if their music was violating copy right infringement laws",
"Successfully won Techcrunch Disrupt",
"Optimized an algorithm that holds the current world record for Weisman Scores"
]
}
],
"volunteer": [
{
"organization": "CoderDojo",
"position": "Teacher",
"website": "http://coderdojo.com/",
"startDate": "2012-01-01",
"endDate": "2013-01-01",
"summary": "Global movement of free coding clubs for young people.",
"highlights": [
"Awarded 'Teacher of the Month'"
]
}
],
"education": [
{
"institution": "University of Oklahoma",
"area": "Information Technology",
"studyType": "Bachelor",
"startDate": "2011-06-01",
"endDate": "2014-01-01",
"gpa": "4.0",
"courses": [
"DB1101 - Basic SQL",
"CS2011 - Java Introduction"
]
}
],
"awards": [
{
"title": "Digital Compression Pioneer Award",
"date": "2014-11-01",
"awarder": "Techcrunch",
"summary": "There is no spoon."
}
],
"publications": [
{
"name": "Video compression for 3d media",
"publisher": "Hooli",
"releaseDate": "2014-10-01",
"website": "http://en.wikipedia.org/wiki/Silicon_Valley_(TV_series)",
"summary": "Innovative middle-out compression algorithm that changes the way we store data."
}
],
"skills": [
{
"name": "Web Development",
"level": "Master",
"keywords": [
"HTML",
"CSS",
"Javascript"
]
},
{
"name": "Compression",
"level": "Master",
"keywords": [
"Mpeg",
"MP4",
"GIF"
]
}
],
"languages": [
{
"language": "English",
"fluency": "Native speaker"
}
],
"interests": [
{
"name": "Wildlife",
"keywords": [
"Ferrets",
"Unicorns"
]
}
],
"references": [
{
"name": "Erlich Bachman",
"reference": "It is my pleasure to recommend Richard, his performance working as a consultant for Main St. Company proved that he will be a valuable addition to any company."
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment