From 4b0ca55eb79e963523eb6c8197825e9e8ae904e2 Mon Sep 17 00:00:00 2001 From: Wu Cheng-Han Date: Mon, 4 May 2015 15:53:29 +0800 Subject: First commit, version 0.2.7 --- public/vendor/gist-embed.js | 179 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 public/vendor/gist-embed.js (limited to 'public/vendor/gist-embed.js') diff --git a/public/vendor/gist-embed.js b/public/vendor/gist-embed.js new file mode 100644 index 00000000..34a9c3b0 --- /dev/null +++ b/public/vendor/gist-embed.js @@ -0,0 +1,179 @@ +// author: Blair Vanderhoof +// https://github.com/blairvanderhoof/gist-embed +// version 2.0 +(function($) { + + function getLineNumbers(lineRangeString) { + var lineNumbers = [], range, lineNumberSections; + + if (typeof lineRangeString === 'number') { + lineNumbers.push(lineRangeString); + } else { + lineNumberSections = lineRangeString.split(','); + + for (var i = 0; i < lineNumberSections.length; i++) { + range = lineNumberSections[i].split('-'); + if (range.length === 2) { + for (var j = parseInt(range[0], 10); j <= range[1]; j++) { + lineNumbers.push(j); + } + } else if (range.length === 1) { + lineNumbers.push(parseInt(range[0], 10)); + } + } + } + return lineNumbers; + } + + $.fn.gist = function() { + return this.each(function() { + var $elem = $(this), + id, + url, + file, + lines, + highlightLines, + hideFooterOption, + hideLineNumbersOption, + showLoading, + data = {}; + + // make block level so loading text shows properly + $elem.css('display', 'block'); + + id = $elem.data('gist-id') || ''; + file = $elem.data('gist-file'); + hideFooterOption = $elem.data('gist-hide-footer') === true; + hideLineNumbersOption = $elem.data('gist-hide-line-numbers') === true; + lines = $elem.data('gist-line'); + highlightLines = $elem.data('gist-highlight-line'); + showLoading = $elem.data('gist-show-loading') !== undefined ? + $elem.data('gist-show-loading') : true; + + if (file) { + data.file = file; + } + + // if the id doesn't exist, then ignore the code block + if (!id) return false; + + url = 'https://gist.github.com/' + id + '.json'; + + // loading + if (showLoading) { + $elem.html('Loading gist ' + url + (data.file ? ', file: ' + data.file : '') + '...'); + } + + // request the json version of this gist + $.ajax({ + url: url, + data: data, + dataType: 'jsonp', + timeout: 10000, + success: function(response) { + var linkTag, + head, + lineNumbers, + highlightLineNumbers, + $responseDiv; + + // the html payload is in the div property + if (response && response.div) { + // github returns /assets/embed-id.css now, but let's be sure about that + if (response.stylesheet && response.stylesheet.indexOf('http') !== 0) { + // add leading slash if missing + if (response.stylesheet.indexOf('/') !== 0) { + response.stylesheet = '/' + response.stylesheet; + } + response.stylesheet = 'https://gist.github.com' + response.stylesheet; + } + + // add the stylesheet if it does not exist + if (response.stylesheet && $('link[href="' + response.stylesheet + '"]').length === 0) { + linkTag = document.createElement('link'); + head = document.getElementsByTagName('head')[0]; + + linkTag.type = 'text/css'; + linkTag.rel = 'stylesheet'; + linkTag.href = response.stylesheet; + head.insertBefore(linkTag, head.firstChild); + } + + // refernce to div + $responseDiv = $(response.div); + + // remove id for uniqueness constraints + $responseDiv.removeAttr('id'); + + $elem.html('').append($responseDiv); + + // option to highlight lines + if (highlightLines) { + highlightLineNumbers = getLineNumbers(highlightLines); + + // we need to set the line-data td to 100% so the highlight expands the whole line + $responseDiv.find('td.line-data').css({ + 'width': '100%' + }); + + // find all .line divs (acutal code lines) that match the highlightLines and add the highlight class + $responseDiv.find('.line').each(function(index) { + if ($.inArray(index + 1, highlightLineNumbers) !== -1) { + $(this).css({ + 'background-color': 'rgb(255, 255, 204)' + }); + } + }); + } + + // if user provided a line param, get the line numbers baesed on the criteria + if (lines) { + lineNumbers = getLineNumbers(lines); + + // find all .line divs (acutal code lines) and remove them if they don't exist in the line param + $responseDiv.find('.line').each(function(index) { + if (($.inArray(index + 1, lineNumbers)) === -1) { + $(this).remove(); + } + }); + + // find all .line-number divs (numbers on the gutter) and remove them if they don't exist in the line param + $responseDiv.find('.line-number').each(function(index) { + if (($.inArray(index + 1, lineNumbers)) === -1) { + $(this).remove(); + } + }); + } + + // option to remove footer + if (hideFooterOption) { + $responseDiv.find('.gist-meta').remove(); + + // present a uniformed border when footer is hidden + $responseDiv.find('.gist-data').css("border-bottom", "0px"); + $responseDiv.find('.gist-file').css("border-bottom", "1px solid #ddd"); + } + + // option to remove + if (hideLineNumbersOption) { + $responseDiv.find('.line-numbers').remove(); + } + + } else { + $elem.html('Failed loading gist ' + url); + } + }, + error: function(jqXHR, textStatus) { + $elem.html('Failed loading gist ' + url + ': ' + textStatus); + } + }); + + }); + }; + + $(function() { + // find all elements containing "data-gist-id" attribute. + $('[data-gist-id]').gist(); + }); + +})(jQuery); -- cgit v1.2.3