Full Code of resume/resume.github.com for AI

master f5990756495b cached
16 files
41.7 KB
11.1k tokens
4 symbols
1 requests
Download .txt
Repository: resume/resume.github.com
Branch: master
Commit: f5990756495b
Files: 16
Total size: 41.7 KB

Directory structure:
gitextract_i1i20v1x/

├── README.markdown
├── config.ru
├── css/
│   ├── print.css
│   └── resume.css
├── index.html
├── js/
│   └── githubresume.js
└── views/
    ├── api_limit.html
    ├── contrib.html
    ├── error.html
    ├── index.html
    ├── job.html
    ├── not_found.html
    ├── opt_out.html
    ├── org.html
    ├── resume.html
    └── resumeOrgs.html

================================================
FILE CONTENTS
================================================

================================================
FILE: README.markdown
================================================
# [GitHub Résumé](https://resume.github.io/)

**A service that creates a résumé based on your GitHub repos/activity.**

GitHub Résumé is **opt-in**. To make your resume visible, just **star** [this project](https://github.com/resume/resume.github.com). To view your résumé, go to `https://resume.github.io/?yourusername` or follow the instructions on the [home page](https://resume.github.io/).

Great for all the tech-savy bosses who want to have a **quick view** of person's git/github activity, _before the interview_.

### Development

To run the app in development mode:

    $ rackup config.ru

(You must have Ruby and the rack gem installed.)


================================================
FILE: config.ru
================================================
use Rack::Static, :urls => ["/css", "/images", "/js", "/views"], :root => "."
run lambda { |env| [200, { 'Content-Type' => 'text/html' }, File.open('index.html', File::RDONLY)] }


================================================
FILE: css/print.css
================================================
/*
    Print stylesheet for résumés
*/


/* =! Template */

#doc2 {
    width: 100%;
}
#inner {
    margin: 0 auto;
    padding: 10pt;
    border: 0;
}
header {
    margin-top: 0;
}

.enlarge {
    padding-right: 0;
}

.talent li {
    border: 0;
}

.org p,
.job p {
    margin: 5pt 0 15pt;
}

#repositories {
    padding-bottom: 0;
}

#jobs h4 {
    margin-top: 10pt;
}

#jobs .job,
#about {
    page-break-inside: avoid;
}

article,
#about {
    margin-bottom: 0;
}

footer {
    padding: 5pt 0;
}

/* --------- */



/* =! Font */

body {
    font-size: 10pt;
}

header h1 {
    font-size: 28pt;
}
header h2 {
    font-size: 14pt;
}

article h2,
#profile .enlarge,
#about .enlarge {
    font-size: 12pt;
}

/* --------- */



/* =! Colors */

body,
h1, h2, h3, h4 {
    color: #000;
}

#inner {
    background: #fff;
}

/* --------- */



/* =! Links */

#profile a:after,
#repositories a:after,
#about a:after {
    content: " (" attr(href) ")";
    font-style: italic;
    font-size: 10pt;
}
#profile #myblog:after,
#jobs p a:after {
    content: none;
}

a {
    text-decoration: none;
}

#mylanguages a,
#jobs p a {
    color: inherit;
}

#actions {
    visibility: hidden;
}

/* --------- */


================================================
FILE: css/resume.css
================================================
/*
---------------------------------------------------------------------------------
    STRIPPED DOWN RESUME TEMPLATE
    html resume

    v0.9: 5/28/09

    design and code by: thingsthatarebrown.com
                        (matt brown)
---------------------------------------------------------------------------------
*/

.msg {
  padding: 10px;
  background: #222;
  position: relative;
}

.msg h1 {  color: #fff }

.msg a {
  margin-left: 20px;
  background: #408814;
  color: white;
  padding: 4px 8px;
  text-decoration: none;
}

.msg a:hover {  background: #266400 }

html {
  height: 100% ! important;
  background: url('../images/low_contrast_linen.png');
}

/* //-- yui-grids style overrides -- */

body {
  font-family: Georgia, Garamond, "Times New Roman", Times, serif;
  color: #444;
}

.yui-gf {
  margin-bottom: 2em;
  padding-bottom: 2em;
  border-bottom: 1px solid #ccc;
}

.yui-gf div.first {  width: 12.3% }

.yui-gf .yui-u {  width: 80.2% }

/* //-- header, body, footer -- */

header {
  margin: 2.5em 0 3em 0;
  padding-bottom: 1.5em;
  border-bottom: 1px solid #ccc;
}

header h1 {
  font-size: 48px;
  text-transform: uppercase;
  letter-spacing: 3px;
}

header h2 {
  text-transform: uppercase;
  letter-spacing: 2px;
}

article,
footer {  margin-bottom: 2em }

footer p {
  margin-bottom: 0;
  text-align: center;
}

/* //-- footer -- */

footer {
  padding: 1em 0 5em 0;
  font-size: 92%;
  border-top: 1px solid #ccc;
  text-align: center;
}

/* //-- core typography and style -- */

h2 {  font-size: 152% }

h3,
h4 {  font-size: 122% }

h1,
h2,
h3,
h4 {  color: #333 }

p {
  font-size: 100%;
  line-height: 18px;
}

a {  color: #990003 }

a:hover {  text-decoration: none }

strong {  font-weight: bold }

li {
  line-height: 24px;
  border-bottom: 1px solid #ccc;
}

p.enlarge {
  font-size: 144%;
  line-height: 24px;
}

.contact-info {
  margin-top: 7px;
  text-align: right;
  font-size: 12px;
  position: relative;
  float: left;
  width: 100%;
}

.contact-info img {
  float: right;
  border: 1px solid #ccc;
  width: 140px;
  height: 140px;
  margin: -24px 0 14px;
  border-radius: 3px;
}

.contact-info a {
  position : relative;
  float: left;
  width: 100%;
}

.first h2 {  font-style: italic }

.last {  border-bottom: 0 }

/* //-- section styles -- */

#pdf {
  display: block;
  float: left;
  background: #666;
  color: #fff;
  padding: 6px 50px 6px 12px;
  margin-bottom: 6px;
  text-decoration: none;
}

#pdf:hover {  background: #222 }

.org,
.job {
  position: relative;
  margin-bottom: 1em;
  padding-bottom: 1em;
  border-bottom: 1px solid #ccc;
}

.org h3,
.job h3 {
  font-size: 100%;
}

.org h4,
.job h4 {
  position: absolute;
  top: 0.35em;
  right: 0;
}

.org a,
.job a {
  border: none;
  text-decoration: none;
}

.org p,
.job p {
  margin: 0.75em 0 3em 0;
  font-size: 122%;
}

.last {  border: none }

.talent {
  width: 32%;
  float: left;
}

.talent h2 {  margin-bottom: 6px }

#srt-ttab {
  margin-bottom: 100px;
  text-align: center;
}

#srt-ttab img.last {  margin-top: 20px }

/* --// override to force 1/8th width grids -- */

#username {
  position: relative;
  float: left;
  height: 30px;
  width: 75%;
  border: 2px solid #444;
  -webkit-border-radius: 4px;
  -moz-border-radius: 4px;
  border-radius: 4px;
  font-family: Georgia, Garamond, "Times New Roman", Times, serif;
  color: #444;
  font-size: 18px;
  padding: 5px;
}

#gen {
  position: relative;
  float: left;
  margin-left: 10px;
  width: 20%;
  height: 44px;
  font-family: Georgia, Garamond, "Times New Roman", Times, serif;
  font-size: 18px;
  color: #fff;
  background-image: -webkit-gradient( linear, left bottom, left top, color-stop(0.21, rgb(31,31,31)), color-stop(0.61, rgb(51,51,51)) );
  background-image: -moz-linear-gradient( center bottom, rgb(31,31,31) 21%, rgb(51,51,51) 61% );
  border: 1px solid #444;
  -webkit-border-radius: 4px;
  -moz-border-radius: 4px;
  border-radius: 4px;
}

#gen:hover {  cursor: pointer }

.yui-gb {
  margin-top: 10px;
  margin-bottom: 10px;
  padding-bottom: 10px;
}

.enlarge-medium {  font-size: 15px }

.yui-gb ul {  width: 80% }

noscript {
  display: block;
  margin-top: 30px;
  font-size: 152%;
  color: #990003;
}

#actions {
  padding: 30px 0 40px 0;
  margin: 0 auto 0 auto;
  width: 73.076em;
}

#actions a {
  color: #ccc;
  text-decoration: none;
  text-shadow: 0 0 5px #000;
  margin-left: 1em;
}

#actions * {  float: right }

#doc {
  margin-top: 70px;
  background: #f5f5f5;
  padding: 25px 107px 0px 107px;
}

#doc2 {  padding-bottom: 70px }

.contributions {
  padding-bottom: 10px;
}

@media screen and (max-width: 59.9em) {
  #inner {
    padding: 5 5 5 5;
    margin: 0 auto;
    background: #f5f5f5;
    border: solid #666;
    border-width: 8px 0 2px 0;
    box-shadow: 0 1px 3px #000;
  }
  header h1 {
    font-size: 2.2em;
    font-weight: bold;
    text-transform: uppercase;
    letter-spacing: 0.2em;
  }

  header h2 {
    font-size: 1.5em;
    text-transform: uppercase;
    letter-spacing: 0.2em;
  }

  #doc2 {
    width: 100%;
    padding-bottom: 1em;
  }
  #actions{
    display: none;
  }

  h1{
    font-size: 2em;
  }
  h2{
    font-size: 1.5em;
  }
  p.enlarge {
    font-size: 1.4em;
    line-height: 1.2em;
  }
  li {
    line-height: 1.6em;
  }
  h3, h4{
    font-size: 1.3em;
  }
  p{
    font-size: 1.2em;
    line-height: 1.1em;
  }
  .org p, .job p {
    margin: 0.75em 0 1.5em 0;
  }
  .first h2, .first h1{
    padding-left: 0.5em;
  }

  .yui-gf div.first {
    width: 20%;
  }

  .yui-gf .yui-u {  width: 80% }

}

@media screen and (min-width: 60em) {
  #inner {
    padding: 10px 80px;
    margin: 0 auto;
    background: #f5f5f5;
    border: solid #666;
    border-width: 8px 0 2px 0;
    box-shadow: 0 1px 3px #000;
  }
}


================================================
FILE: index.html
================================================
<!DOCTYPE html>
<html lang="en">
<head>
  <title>GitHub R&eacute;sum&eacute;</title>
  <meta charset="utf-8" />
  <!--[if IE]>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.0/html5shiv.min.js"></script>
  <![endif]-->
  <meta name="keywords" content="cv, resume, hResume, github, community, free, fun, nice, useful" />
  <meta name="description" content="GitHub resumes, generated by the community, for the community." />
  <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/yui/2.7.0/reset-fonts-grids/reset-fonts-grids.css" media="all" />
  <link rel="stylesheet" type="text/css" href="css/resume.css" media="all" />
  <link rel="stylesheet" type="text/css" href="css/print.css" media="print" />
  <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
  <script>window.jQuery || document.write('<script src="js/vendor/jquery-2.1.4.min.js"><\/script>')</script>
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mustache.js/0.3.0/mustache.min.js"></script>
  <script type="text/javascript" src="js/githubresume.js"></script>

  <link rel="icon" type="image/png" href="images/favicon.png">
</head>
<body id="resume">
  <noscript>You need to enable Javascript to generate and see r&eacute;sum&eacute; pages.</noscript>
</body>
</html>


================================================
FILE: js/githubresume.js
================================================
var urlParams = {};
var username;
var trackerId = 'UA-21222559-1';

(function () {
    var e,
        a = /\+/g,  // Regex for replacing addition symbol with a space
        r = /([^&=]+)=?([^&]*)/g,
        d = function (s) { return decodeURIComponent(s.replace(a, " ")); },
        q = window.location.search.substring(1);

    while (e = r.exec(q)) {
       urlParams[0] = d(e[1]);
    }
})();

$(document).ready(function() {
    try {
        if (urlParams[0] !== undefined) {
            username = urlParams[0];
            run();
        } else {
            home();
        }
    } catch (err) {
        try {
            console.log(err);
        } catch (e) {
            /*fail silently*/
        }
    }
});

var error = function() {
    $.ajax({
        url: 'views/error.html',
        dataType: 'html',
        success: function(data) {
            var template = data;
            $('#resume').html(data);
        }
    });
};

var home = function() {
    $.ajax({
        url: 'views/index.html',
        dataType: 'html',
        success: function(data) {
            var template = data;
            $('#resume').html(data);
        }
    });
};

var github_user = function(username, callback) {
    $.getJSON('https://api.github.com/users/' + username + '?callback=?', callback);
}

var github_user_repos = function(username, callback, page_number, prev_data) {
    var page = (page_number ? page_number : 1),
        url = 'https://api.github.com/users/' + username + '/repos?per_page=100&callback=?',
        data = (prev_data ? prev_data : []);

    if (page_number > 1) {
        url += '&page=' + page_number;
    }
    $.getJSON(url, function(repos) {
        data = data.concat(repos.data);
        if (repos.data.length == 100) {
            github_user_repos(username, callback, page + 1, data);
        } else {
            callback(data);
        }
    });
}

var github_user_issues = function(username, callback, page_number, prev_data) {
    var page = (page_number ? page_number : 1),
        url = 'https://api.github.com/search/issues?q=type:pr+is:merged+author:' + username + '&per_page=100&callback=?'
        data = (prev_data ? prev_data : []);

    if (page_number > 1) {
        url += '&page=' + page_number;
    }

    $.getJSON(url, function(repos) {
        data = data.concat(repos.data.items);
        if (repos.data.total_count == 100) {
            github_user_issues(username, callback, page + 1, data);
        } else {
            callback(data);
        }
    });
}

var github_user_orgs = function(username, callback) {
    $.getJSON('https://api.github.com/users/' + username + '/orgs?callback=?', callback);
}

// Check to see if the user has starred the resume.github.com repo.
//
// Returns true/false.
var github_user_starred_resume = function(username, page) {
    var star  = false;
    var repos = [];
    var page  = (page ? page : 1);
    var url   = 'https://api.github.com/users/' + username + '/starred?per_page=100&page=' + page;
    var errorMsg;

    $.ajax({
        url: url,
        async: false,
        dataType: 'json',
        success: function(data) {
            repos = data;
        },
        error: function(e) {
            if (e.status == 403) {
                errorMsg = 'api_limit'
            } else if (e.status == 404) {
                errorMsg = 'not_found'
            }
        }
    });

    if (errorMsg === 'api_limit' || errorMsg === 'not_found') {
        return errorMsg;
    }

    $.each(repos, function(i, repo) {
        if (repo.full_name == "resume/resume.github.com") {
            star = true;
            return false; // stop iterating
        }
    });

    if (star) {
        return star;
    }

    if (repos.length == 100) {
        star = github_user_starred_resume(username, page + 1);
    }

    return star;
}

var run = function() {
    var itemCount = 0,
        maxItems = 5,
        maxLanguages = 9,
        starred = github_user_starred_resume(username);

    if (!starred || starred === 'api_limit' || starred === 'not_found') {
        if (starred === 'api_limit') {
            $.ajax({
                url: 'views/api_limit.html',
                dataType: 'html',
                success: function(data) {
                    var template = data;
                    $('#resume').html(data);
                }
            });
        } else if (starred === 'not_found') {
            $.ajax({
                url: 'views/not_found.html',
                dataType: 'html',
                success: function(data) {
                    var template = data;
                    $('#resume').html(data);
                }
            });
        } else {
            $.ajax({
                url: 'views/opt_out.html',
                dataType: 'html',
                success: function(data) {
                    var template = data;
                    $('#resume').html(data);
                }
            });
        }
        return;
    }

    var res = github_user(username, function(data) {
        data = data.data;
        var sinceDate = new Date(data.created_at);
        var sinceMonth = sinceDate.getMonth();
        var since = sinceDate.getFullYear();
        var sinceMonth = sinceDate.getMonth();
        var currentYear = (new Date).getFullYear();
        switch (since) {
          case currentYear-1:
            since = 'last year';
            break;
          case currentYear:
            since = 'this year';
            break;
        }

        var addHttp = '';
        if (data.blog && data.blog.indexOf('http') < 0) {
            addHttp = 'http://';
        }

        // set view.name to the "friendly" name e.g. "John Doe". If not defined
        // (in which case data.name is empty), fall back to the login
        // name e.g. "johndoe"
        var name = username;
        if (data.name !== null && data.name !== undefined && data.name.length) {
            name = data.name;
        }

        var avatar = '';
        if (data.type == 'Organization'){
            avatar = data.avatar_url.match(/https:\/\/secure.gravatar.com\/avatar\/[0-9a-z]+/)[0];
            avatar += '?s=140&amp;d=https://github.com/images/gravatars/gravatar-140.png';
        }

        var view = {
            name: name,
            type: data.type,
            email: data.email,
            created_at: data.created_at,
            earlyAdopter: 0,
            location: data.location,
            gravatar_id: data.gravatar_id,
            avatar_url: avatar,
            repos: data.public_repos,
            reposLabel: data.public_repos > 1 ? 'repositories' : 'repository',
            followers: data.followers,
            followersLabel: data.followers > 1 ? 'followers' : 'follower',
            username: username,
            userStatus: 'GitHub user',
            since: since,
            resume_url: window.location
        };

        // We consider a limit of 4 months since the GitHub opening (Feb 2008) to be considered as an early adopter
        if ((since == '2008' && sinceMonth <= 5) || since <= '2007') {
            view.earlyAdopter = 1;
        }

        view.userStatus = getUserStatus();
        function getUserStatus() {
            var COEF_REPOS = 2;
            var COEF_GISTS = 0.25;
            var COEF_FOLLOWERS = 0.5;
            var COEF_FOLLOWING = 0.25;
            var FIRST_STEP = 0;
            var SECOND_STEP = 5;
            var THIRD_STEP = 20;
            var FOURTH_STEP = 50;
            var FIFTH_STEP = 150;
            var EXTRA_POINT_GAIN = 1;

            var statusScore = data.public_repos * COEF_REPOS
                            + data.public_gists * COEF_GISTS
                            + data.followers * COEF_FOLLOWERS
                            + data.following * COEF_FOLLOWING;

            // Extra points
            // - Early adopter
            if (view.earlyAdopter == 1) {
                statusScore += EXTRA_POINT_GAIN;
            }
            // - Blog & Email & Location
            if (view.location && view.location != '' && view.email && view.email != '' && data.blog && data.blog != '') {
              statusScore += EXTRA_POINT_GAIN;
            }

            if (statusScore == FIRST_STEP) {
              return 'Inactive GitHub user';
            }
            else if (statusScore > FIRST_STEP && statusScore <= SECOND_STEP) {
              return 'Newbie GitHub user';
            }
            else if (statusScore > SECOND_STEP && statusScore <= THIRD_STEP) {
              return 'Regular GitHub user';
            }
            else if (statusScore > THIRD_STEP && statusScore <= FOURTH_STEP) {
              return 'Advanced GitHub user';
            }
            else if (statusScore > FOURTH_STEP && statusScore <= FIFTH_STEP) {
              return 'Enthusiastic GitHub user';
            }
            else if (statusScore > FIFTH_STEP) {
              return 'Passionate GitHub user';
            }
        };

        if (data.blog !== undefined && data.blog !== null && data.blog !== '') {
            view.website = addHttp + data.blog;
        }

        var resume = (data.type == 'User' ? 'views/resume.html' : 'views/resumeOrgs.html');
        $.ajax({
            url: resume,
            dataType: 'html',
            success: function(data) {
                var template = data,
                    html = Mustache.to_html(template, view);
                $('#resume').html(html);
                document.title = name + "'s Résumé";
                $("#actions #print").click(function(){
                    window.print();
                    return false;
                });
            }
        });
    });

    github_user_repos(username, function(data) {
        var sorted = [],
            languages = {},
            popularity;

        $.each(data, function(i, repo) {
            if (repo.fork !== false) {
                return;
            }

            if (repo.language) {
                if (repo.language in languages) {
                    languages[repo.language]++;
                } else {
                    languages[repo.language] = 1;
                }
            }

            popularity = repo.watchers + repo.forks;
            sorted.push({position: i, popularity: popularity, info: repo});
        });

        function sortByPopularity(a, b) {
            return b.popularity - a.popularity;
        };

        sorted.sort(sortByPopularity);

        var languageTotal = 0;
        function sortLanguages(languages, limit) {
            var sorted_languages = [];

            for (var lang in languages) {
                if (typeof(lang) !== "string") {
                    continue;
                }
                sorted_languages.push({
                    name: lang,
                    popularity: languages[lang],
                    toString: function() {
                        return '<a href="https://github.com/search?q=user%3A'
                            + username + '&l=' + encodeURIComponent(this.name) + '">'
                            + this.name + '</a>';
                    }
                });

                languageTotal += languages[lang];
            }

            if (limit) {
                sorted_languages = sorted_languages.slice(0, limit);
            }

            return sorted_languages.sort(sortByPopularity);
        }

        $.ajax({
            url: 'views/job.html',
            dataType: 'html',
            success: function(response) {
                languages = sortLanguages(languages, maxLanguages);

                if (languages && languages.length > 0) {
                    var ul = $('<ul class="talent"></ul>'),
                        percent, li;

                    $.each(languages, function(i, lang) {
                        x = i + 1;
                        percent = parseInt((lang.popularity / languageTotal) * 100);
                        li = $('<li>' + lang.toString() + ' ('+percent+'%)</li>');

                        if (x % 3 == 0 || (languages.length < 3 && i == languages.length - 1)) {
                            li.attr('class', 'last');
                            ul.append(li);
                            $('#content-languages').append(ul);
                            ul = $('<ul class="talent"></ul>');
                        } else {
                            ul.append(li);
                            $('#content-languages').append(ul);
                        }
                    });
                } else {
                    $('#mylanguages').hide();
                }

                if (sorted.length > 0) {
                    $('#jobs').html('');
                    itemCount = 0;
                    var since, until, date, view, template, html;

                    $.each(sorted, function(index, repo) {
                        if (itemCount >= maxItems) {
                            return;
                        }

                        since = new Date(repo.info.created_at);
                        since = since.getFullYear();
                        until = new Date(repo.info.pushed_at);
                        until = until.getFullYear();
                        if (since == until) {
                            date = since;
                        } else {
                            date = since + ' &ndash; ' + until;
                        }
                        var emojiPattern = /:([a-z0-9_\+\-]+):/g;
                        // no, it's not really a pattern
                        var imagePattern = "<img width='20' height='20' src='https://assets-cdn.github.com/images/icons/emoji/$1.png' />";
                        var description = repo.info.description;
                        repo.info.description = description ? description.replace(emojiPattern, imagePattern) : description;
                        view = {
                            name: repo.info.name,
                            date: date,
                            language: repo.info.language,
                            description: repo.info.description,
                            homepage: repo.info.homepage,
                            username: username,
                            watchers: repo.info.watchers,
                            forks: repo.info.forks,
                            watchersLabel: repo.info.watchers == 0 || repo.info.watchers > 1 ? 'stars' : 'star',
                            forksLabel: repo.info.forks == 0 || repo.info.forks > 1 ? 'forks' : 'fork',
                        };

                        if (itemCount == sorted.length - 1 || itemCount == maxItems - 1) {
                            view.last = 'last';
                        }

                        template = response;
                        html = Mustache.to_html(template, view);

                        $('#jobs').append($(html));
                        ++itemCount;
                    });
                } else {
                    if(data.length > 0){
                      $('#jobs').html('').append('<p class="enlarge">All of this user\'s repositories seem to be forks. Sorry.</p>');
                    } else {
                      $('#jobs').html('').append('<p class="enlarge">Unfortunately, this user does not seem to have any <strong>public</strong> repositories.</p>');
                    }
                }
            }
        });
    });

    github_user_issues(username, function(data) {
        var sorted = [],
            repos = {};

        $.each(data, function(i, issue) {
            if(repos[issue.repository_url] === undefined) {
                repos[issue.repository_url] = { popularity: 1 }
            } else {
                repos[issue.repository_url].popularity += 1;
            }
        });

        $.each(repos, function(repo, obj) {
            sorted.push({ repo: repo, popularity: obj.popularity});
        })

        function sortByPopularity(a, b) {
            return b.popularity - a.popularity;
        };

        sorted.sort(sortByPopularity);

        $.ajax({
            url: 'views/contrib.html',
            dataType: 'html',
            success: function(response) {
                if (sorted.length > 0) {
                    $('#contrib-jobs').html('');
                    var view, template, html, repoUrl, repoName, commitsUrl;
                    $.each(sorted, function(index, repo) {
                        repoUrl = repo.repo.replace(/https:\/\/api\.github\.com\/repos/, 'https://github.com');
                        repoName = repo.repo.replace(/https:\/\/api\.github\.com\/repos\//, '');
                        commitsUrl = repoUrl + '/commits?author=' + username;
                        view = {
                            count: repo.popularity,
                            username: username,
                            repoUrl: repoUrl,
                            repoName: repoName,
                            commitsUrl: commitsUrl
                        };

                        template = response;
                        html = Mustache.to_html(template, view);

                        $('#contrib-jobs').append($(html));
                    });
                } else {
                    $('#contributions').remove();
                }
            }
        });
    });

    github_user_orgs(username, function(response) {
        var sorted = [];

        $.each(response.data, function(i, org) {
            if (org.login === undefined) {
                return;
            }
            sorted.push({position: i, info: org});
        });

        $.ajax({
            url: 'views/org.html',
            dataType: 'html',
            success: function(response) {
                var now = new Date().getFullYear();

                if (sorted.length > 0) {
                    $('#orgs').html('');

                    var name, view, template, html;

                    $.each(sorted, function(index, org) {
                        if (itemCount >= maxItems) {
                            return;
                        }
                        name = (org.info.name || org.info.login);
                        view = {
                            name: name,
                            now: now
                        };

                        if (itemCount == sorted.length - 1 || itemCount == maxItems) {
                            view.last = 'last';
                        }
                        template = response;
                        html = Mustache.to_html(template, view);

                        $('#orgs').append($(html));
                        ++itemCount;
                    });
                } else {
                    $('#organizations').remove();
                }
            }
        });
    });

};

if (trackerId) {
  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', trackerId]);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();
}

$(window).bind('error', error);


================================================
FILE: views/api_limit.html
================================================
<div id="doc" class="yui-t7">
  <header role="banner"><h1>API Limit Reached</h1></header>
  <article role="main">
    <div class="yui-g">
        <p>The API rate limit has been exceeded for your IP address. Please try again later.</p>
    </div>
  </article>

  <footer role="contentinfo"></footer>
</div>


================================================
FILE: views/contrib.html
================================================
<div class="contributions">
  <h2>
    <a href="{{repoUrl}}">{{repoName}}</a>
  </h2>
  <p>{{username}} has contributed for <a href="{{repoUrl}}">{{repoName}}</a> with <a href="{{commitsUrl}}">{{count}} commit(s)</a></p>
</div>


================================================
FILE: views/error.html
================================================
<div id="doc" class="yui-t7">
  <header role="banner"><h1>Uh oh :(</h1></header>
  <article role="main">
    <div class="yui-g">
      <p>
        There was an issue accessing the requested profile to auto-generate this r&eacute;sum&eacute;. <a href="https://github.com/{{username}}" title="GitHub profile of {{username}}">Access the user's profile directly.</a>
      </p>
    </div>
  </article>
  <footer role="contentinfo"><p>Brought to you by the brilliant mind of <a href="https://twitter.com/davidcoallier">@davidcoallier</a> &lt;/modesty&gt; &mdash; Resume Template from <a href="http://thingsthatarebrown.com/blog/2009/05/sample-resume-template/">Things That Are Brown</a></p></footer>
</div>


================================================
FILE: views/index.html
================================================
<div id="doc" class="yui-t7">
  <header role="banner"><h1>My GitHub R&eacute;sum&eacute;</h1></header>
  <article role="main">
    <div class="yui-g">
      <p class="enlarge-medium">
        As a software startup owner I really enjoy when people send us their
        r&eacute;sum&eacute;s and they include their github account so we can see tangible work they have done.
      </p>
      <p><br /></p>
      <p class="enlarge-medium">
        After a <a href="https://twitter.com/#!/jeresig/status/33968704983138304">tweet by John Resig</a>
        I imagined that it may be nice for people to be able to generate their <a href="https://github.com" title="GitHub">GitHub</a> r&eacute;sum&eacute;s.
      </p>
      <p><br /><br /></p>

      <form id="run" action="." method="get">
        <p>
          <input id="username" type="text" placeholder="Enter your GitHub username and click on generate" autofocus />
          <button type="submit" id="gen">Generate</button>
        </p>
      </form>

    </div>

    <div class="yui-g">
      <p><br /><br /></p>
      <h2>See some popular users</h2>
      <div class="yui-gb">
        <ul>
          <li><a href="/?mxcl" title="Max Howell">Max Howell</a></li>
        </ul>
      </div>
      <div class="yui-gb">
        <ul>
          <li class=""><a href="/?defunkt" title="Chris Wanstrath">Chris Wanstrath</a></li>
        </ul>
      </div>
      <br />
    </div>

    <div class="yui-g last">
      <div class="yui-main">
        <br /><br />
        <h2>Notes, Information and Future features</h2>
        <p class="enlarge-medium"><br />
        This is the first version. I am planning on adding
        things as such as your most committed forks, most committed repositories and make the "My Popular Repositories" be built from
        your complete list of repositories. Feel free to <a href="https://github.com/resume/resume.github.com">fork the page</a> if you want to help :-)
        <br /><br />
        </p>
      </div>
    </div>
  </article>

  <footer role="contentinfo"><p>Brought to you by the brilliant mind of <a href="https://twitter.com/davidcoallier">@davidcoallier</a> &lt;/modesty&gt; &mdash; R&eacute;sum&eacute; Template from <a href="http://thingsthatarebrown.com/blog/2009/05/sample-resume-template/">Things That Are Brown</a></p></footer>
</div>

<script type="text/javascript">
$(document).ready(function() {
    $('form#run').submit(function(e){
        var genUser = $('#username').val();
        document.location = document.location.pathname + "?" + genUser;
        e.preventDefault();
    });
});
</script>


================================================
FILE: views/job.html
================================================
<div class="job {{last}}">
  <h2>
    <a href="https://github.com/{{username}}/{{name}}">{{name}}</a>
  </h2>
  <h3>{{#language}}{{language}} &ndash; {{/language}}Creator &amp; Owner</h3>
  <h4>{{date}}</h4>
  <p>{{{description}}} {{#homepage}}<a href="{{homepage}}">{{homepage}}</a>{{/homepage}}</p>
  <p>
    This repository has {{watchers}} {{watchersLabel}} and {{forks}} {{forksLabel}}.
    If you would like more information about this repository and my
    contributed code, please visit
    <a href="https://github.com/{{username}}/{{name}}">the repo</a> on
    GitHub.
  </p>
</div>


================================================
FILE: views/not_found.html
================================================
<div id="doc" class="yui-t7">
  <header role="banner"><h1>User Not Found</h1></header>
  <article role="main">
    <div class="yui-g">
      <p>The user you requested was not found. Please check your spelling and try again.</p>
    </div>
  </article>

  <footer role="contentinfo"></footer>
</div>


================================================
FILE: views/opt_out.html
================================================
<div id="doc" class="yui-t7">
  <header role="banner"><h1>This user hasn't opted in</h1></header>
  <article role="main">
    <div class="yui-g">
      <p>This user has <strong>not</strong> opted in to this unofficial GitHub résumé service.</p>
      <br />
      <p>If you would like to opt-in, simply go to our <a href="https://github.com/resume/resume.github.com">GitHub Project</a> page and <strong>star</strong> the project.</p>
    </div>
  </article>

  <footer role="contentinfo"></footer>
</div>


================================================
FILE: views/org.html
================================================
<div class="org {{last}}">
  <h2>{{name}}</h2>
  <h3>Member</h3>
  <h4>{{now}}</h4>
  <p>If you would like more information about this organization, please visit <a href="https://github.com/{{name}}">the organization page</a> on GitHub.</p>
</div>


================================================
FILE: views/resume.html
================================================
<div id="actions" class="yui-t7">
  <a href="#" id="print">Print</a>
  <a href="mailto:?subject=Resume for {{name}}&body=Link to resume: {{resume_url}}" id="email">Email</a>
</div>

<div id="doc2" class="yui-t7">

  <div id="inner" class="vcard">

    <header>
      <div class="yui-gc">
        <div class="yui-u first">
          <h1 class="fn">{{name}}</h1>
          <h2>{{userStatus}}</h2>
        </div>

        <div class="yui-u">
          <div class="contact-info">
            {{#gravatar_id}}
            <img src="https://secure.gravatar.com/avatar/{{gravatar_id}}?s=140&amp;d=https://github.com/images/gravatars/gravatar-140.png" alt="avatar" class="photo" />
            {{/gravatar_id}}
            {{#email}}<h3><a href="mailto:{{email}}" class="email">{{email}}</a></h3>{{/email}}
          </div><!--// .contact-info -->
        </div>
      </div><!--// .yui-gc -->
    </header>

    <article>
      <div id="yui-main">
        <div class="yui-b">

          <div id="profile" class="yui-gf">
            <div class="yui-u first">
              <h2>GitHub Profile</h2>
            </div>
            <div class="yui-u">
              <p class="enlarge">
                 On GitHub {{#earlyAdopter}}as an early adopter {{/earlyAdopter}} since {{since}}, {{name}} is a developer
                 {{#location}}
                 based in <span class="adr locality">{{location}}</span>
                 {{/location}}
                 {{#repos}}with <a href="https://github.com/{{{username}}}?tab=repositories">{{repos}} public {{reposLabel}}</a>{{/repos}}{{^repos}}without any public repository for now{{/repos}}{{#followers}}&nbsp;and <a href="https://github.com/{{{username}}}/followers">{{followers}} {{followersLabel}}</a>{{/followers}}.
              </p>
            </div>
          </div><!--// .yui-gf -->
          {{#website}}
          <div class="yui-gf" id="mywebsite">
            <div class="yui-u first">
              <h2>Website</h2>
            </div>
            <div class="yui-u" id="content-website">
              <a href="{{website}}" id="mywebsite" title="{{name}}'s website">{{website}}</a>
            </div>
          </div>
          {{/website}}
          <div class="yui-gf" id="mylanguages">
            <div class="yui-u first">
                <h2>Languages</h2>
            </div>
            <div class="yui-u" id="content-languages">
            </div>
          </div>
          <div id="repositories" class="yui-gf">
            <div class="yui-u first">
              <h2>Popular Repositories</h2>
            </div><!--// .yui-u -->

            <div class="yui-u" id="jobs">
              <span>Loading information...</span><img src="images/loader.gif" />
            </div><!--// .yui-u -->
          </div><!--// .yui-gf -->

          <div id="contributions" class="yui-gf">
            <div class="yui-u first">
              <h2>Contributions</h2>
            </div><!--// .yui-u -->

            <div class="yui-u" id="contrib-jobs">
              <span>Loading information...</span><img src="images/loader.gif" />
            </div><!--// .yui-u -->
          </div><!--// .yui-gf -->

          <div class="yui-gf" id="organizations">
            <div class="yui-u first">
              <h2>Organizations</h2>
            </div><!--// .yui-u -->

            <div class="yui-u" id="orgs">
              <span>Loading information...</span><img src="images/loader.gif" />
            </div><!--// .yui-u -->
          </div><!--// .yui-gf -->

          <div id="about" class="yui-gf last">
            <div class="yui-u first">
              <h2>About This R&eacute;sum&eacute;</h2>
            </div>
            <div class="yui-u">
              <p class="enlarge">
                This r&eacute;sum&eacute; is generated automatically using public information from the developer's GitHub account. The repositories are
                ordered by popularity based on a very simple popularity heuristic that defines the popularity of a repository
                by its sum of watchers and forks. Do not hesitate to visit <a href="https://github.com/{{{username}}}" title="{{name}}'s GitHub page">{{name}}'s GitHub page</a>
                for a complete work history.
              </p>
            </div>
          </div><!--// .yui-gf -->
        </div><!--// .yui-b -->
      </div><!--// yui-main -->
    </article>

    <footer>
      <p>{{name}} &mdash; {{#email}}<a href="mailto:{{email}}">{{email}}</a> &mdash; {{/email}} {{#website}}<a href="{{website}}" title="{{name}}'s website">{{website}}</a> &mdash; {{/website}} <a href="https://github.com/{{username}}" title="GitHub profile" class="url">https://github.com/{{username}}</a></p>
    </footer>

  </div><!-- // inner -->

</div><!--// doc -->


================================================
FILE: views/resumeOrgs.html
================================================
<div id="doc2" class="yui-t7">
  <div id="inner">

    <header>
      <div class="yui-gc">
        <div class="yui-u first">
          <hgroup>
            <h1>{{name}}</h1>
            <h2>Github organization</h2>
          </hgroup>
        </div>

        <div class="yui-u">
          <div class="contact-info">
            {{#gravatar_id}}
            <img src="{{avatar_url}}" alt="avatar" class="photo"/>
            {{/gravatar_id}}
            {{#email}}<h3><a href="mailto:{{email}}">{{email}}</a></h3>{{/email}}
          </div><!--// .contact-info -->
        </div>
      </div><!--// .yui-gc -->
    </header>

    <article>
      <div id="yui-main">
        <div class="yui-b">

          <div class="yui-gf">
            <div class="yui-u first">
              <h2>Github Profile</h2>
            </div>
            <div class="yui-u">
              <p class="enlarge">
                 We are a group of developers
                 {{#location}}
                 based in {{location}}
                 {{/location}}
                 {{#repos}}
                 with <a href="https://github.com/{{{username}}}?tab=repositories">{{repos}} public {{reposLabel}}</a>
                 {{/repos}}
                 {{#followers}}&nbsp;and <a href="https://github.com/{{{username}}}/followers">{{followers}} {{followersLabel}}</a>{{/followers}}.
                 We created this GitHub group in {{since}}{{#earlyAdopter}}, therefore we're early adopters,{{/earlyAdopter}}{{#website}}&nbsp;and you can find more information about us at <a href="{{website}}" id="mywebsite" title="my website">{{website}}</a>{{/website}}.
              </p>
              <p id="languages" class="enlarge"></p>
            </div>
          </div><!--// .yui-gf -->
          <div class="yui-gf" id="mylanguages">
              <div class="yui-u first">
                  <h2>Languages</h2>
              </div>
              <div class="yui-u" id="content-languages">

              </div>
          </div>
          <div class="yui-gf">
            <div class="yui-u first">
              <h2>Our Popular Repositories</h2>
            </div><!--// .yui-u -->

            <div class="yui-u" id="jobs">
              <span>Loading information...</span><img src="images/loader.gif" />
            </div><!--// .yui-u -->
          </div><!--// .yui-gf -->

          <div class="yui-gf last">
            <div class="yui-u first">
              <h2>About This R&eacute;sum&eacute;</h2>
            </div>
            <div class="yui-u">
              <p class="enlarge">
                This r&eacute;sum&eacute; is generated automatically using information from github. The repositories are
                ordered by popularity based on a very simple popularity heuristic that defines the popularity of a repository
                by its sum of watchers and forks. Do not hesitate to visit <a href="https://github.com/{{{username}}}" title="My Github page">our github group's page</a>
                for more information about our repositories and work.
              </p>
            </div>
          </div><!--// .yui-gf -->
        </div><!--// .yui-b -->
      </div><!--// yui-main -->
    </article>

    <footer>
      <p>{{name}} &mdash; {{#email}}<a href="mailto:{{email}}">{{email}}</a> &mdash; {{/email}} <a href="https://github.com/{{username}}" title="Github profile">https://github.com/{{username}}</a></p>
    </footer>

  </div><!-- // inner -->

</div><!--// doc -->
Download .txt
gitextract_i1i20v1x/

├── README.markdown
├── config.ru
├── css/
│   ├── print.css
│   └── resume.css
├── index.html
├── js/
│   └── githubresume.js
└── views/
    ├── api_limit.html
    ├── contrib.html
    ├── error.html
    ├── index.html
    ├── job.html
    ├── not_found.html
    ├── opt_out.html
    ├── org.html
    ├── resume.html
    └── resumeOrgs.html
Download .txt
SYMBOL INDEX (4 symbols across 1 files)

FILE: js/githubresume.js
  function getUserStatus (line 247) | function getUserStatus() {
  function sortByPopularity (line 337) | function sortByPopularity(a, b) {
  function sortLanguages (line 344) | function sortLanguages(languages, limit) {
  function sortByPopularity (line 474) | function sortByPopularity(a, b) {
Condensed preview — 16 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (46K chars).
[
  {
    "path": "README.markdown",
    "chars": 650,
    "preview": "# [GitHub Résumé](https://resume.github.io/)\n\n**A service that creates a résumé based on your GitHub repos/activity.**\n\n"
  },
  {
    "path": "config.ru",
    "chars": 179,
    "preview": "use Rack::Static, :urls => [\"/css\", \"/images\", \"/js\", \"/views\"], :root => \".\"\nrun lambda { |env| [200, { 'Content-Type' "
  },
  {
    "path": "css/print.css",
    "chars": 1200,
    "preview": "/*\n    Print stylesheet for résumés\n*/\n\n\n/* =! Template */\n\n#doc2 {\n    width: 100%;\n}\n#inner {\n    margin: 0 auto;\n    "
  },
  {
    "path": "css/resume.css",
    "chars": 6127,
    "preview": "/*\r\n---------------------------------------------------------------------------------\r\n    STRIPPED DOWN RESUME TEMPLATE"
  },
  {
    "path": "index.html",
    "chars": 1376,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <title>GitHub R&eacute;sum&eacute;</title>\n  <meta charset=\"utf-8\" />\n  <!--[i"
  },
  {
    "path": "js/githubresume.js",
    "chars": 19275,
    "preview": "var urlParams = {};\nvar username;\nvar trackerId = 'UA-21222559-1';\n\n(function () {\n    var e,\n        a = /\\+/g,  // Reg"
  },
  {
    "path": "views/api_limit.html",
    "chars": 306,
    "preview": "<div id=\"doc\" class=\"yui-t7\">\n  <header role=\"banner\"><h1>API Limit Reached</h1></header>\n  <article role=\"main\">\n    <d"
  },
  {
    "path": "views/contrib.html",
    "chars": 228,
    "preview": "<div class=\"contributions\">\n  <h2>\n    <a href=\"{{repoUrl}}\">{{repoName}}</a>\n  </h2>\n  <p>{{username}} has contributed "
  },
  {
    "path": "views/error.html",
    "chars": 702,
    "preview": "<div id=\"doc\" class=\"yui-t7\">\n  <header role=\"banner\"><h1>Uh oh :(</h1></header>\n  <article role=\"main\">\n    <div class="
  },
  {
    "path": "views/index.html",
    "chars": 2603,
    "preview": "<div id=\"doc\" class=\"yui-t7\">\n  <header role=\"banner\"><h1>My GitHub R&eacute;sum&eacute;</h1></header>\n  <article role=\""
  },
  {
    "path": "views/job.html",
    "chars": 592,
    "preview": "<div class=\"job {{last}}\">\n  <h2>\n    <a href=\"https://github.com/{{username}}/{{name}}\">{{name}}</a>\n  </h2>\n  <h3>{{#l"
  },
  {
    "path": "views/not_found.html",
    "chars": 299,
    "preview": "<div id=\"doc\" class=\"yui-t7\">\n  <header role=\"banner\"><h1>User Not Found</h1></header>\n  <article role=\"main\">\n    <div "
  },
  {
    "path": "views/opt_out.html",
    "chars": 505,
    "preview": "<div id=\"doc\" class=\"yui-t7\">\n  <header role=\"banner\"><h1>This user hasn't opted in</h1></header>\n  <article role=\"main\""
  },
  {
    "path": "views/org.html",
    "chars": 248,
    "preview": "<div class=\"org {{last}}\">\n  <h2>{{name}}</h2>\n  <h3>Member</h3>\n  <h4>{{now}}</h4>\n  <p>If you would like more informat"
  },
  {
    "path": "views/resume.html",
    "chars": 4891,
    "preview": "<div id=\"actions\" class=\"yui-t7\">\r\n  <a href=\"#\" id=\"print\">Print</a>\r\n  <a href=\"mailto:?subject=Resume for {{name}}&bo"
  },
  {
    "path": "views/resumeOrgs.html",
    "chars": 3477,
    "preview": "<div id=\"doc2\" class=\"yui-t7\">\n  <div id=\"inner\">\n\n    <header>\n      <div class=\"yui-gc\">\n        <div class=\"yui-u fir"
  }
]

About this extraction

This page contains the full source code of the resume/resume.github.com GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 16 files (41.7 KB), approximately 11.1k tokens, and a symbol index with 4 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!