lib/onebox/engine/github_gist_onebox.rb in onebox-1.5.5 vs lib/onebox/engine/github_gist_onebox.rb in onebox-1.5.6
- old
+ new
@@ -1,29 +1,78 @@
-# This is broken, document.write is only allowed on load
-# See: http://stackoverflow.com/questions/9154026/jquery-dynamically-load-a-gist-embed
module Onebox
module Engine
class GithubGistOnebox
include Engine
+ include LayoutSupport
+ include JSON
+ MAX_FILES = 3
+
matches_regexp Regexp.new("^http(?:s)?://gist\\.(?:(?:\\w)+\\.)?(github)\\.com(?:/)?")
def url
"https://api.github.com/gists/#{match[:sha]}"
end
- def to_html
- "<script src=\"//gist.github.com/#{match[:sha]}.js\"></script>"
- end
-
private
def data
- { sha: match[:sha], title: match[:sha], link: @url }
+ @data ||= {
+ title: 'gist.github.com',
+ link: link,
+ gist_files: gist_files.take(MAX_FILES),
+ truncated_files?: truncated_files?
+ }
end
+ def truncated_files?
+ gist_files.size > MAX_FILES
+ end
+
+ def gist_files
+ return [] unless gist_api
+
+ @gist_files ||= gist_api["files"].values.map do |file_json|
+ GistFile.new(file_json)
+ end
+ end
+
+ def gist_api
+ @raw ||= raw.clone
+ rescue OpenURI::HTTPError
+ # The Gist API rate limit of 60 requests per hour was reached.
+ nil
+ end
+
def match
@match ||= @url.match(%r{gist\.github\.com/([^/]+/)?(?<sha>[0-9a-f]+)})
+ end
+
+ class GistFile
+ attr_reader :filename
+ attr_reader :language
+
+ MAX_LINES = 10
+
+ def initialize(json)
+ @json = json
+ @filename = @json["filename"]
+ @language = @json["language"]
+ end
+
+ def content
+ lines.take(MAX_LINES).join("\n")
+ end
+
+ def truncated?
+ lines.size > MAX_LINES
+ end
+
+ private
+
+ def lines
+ @lines ||= @json["content"].split("\n")
+ end
end
end
end
end