class Jekyll::Gist::GistTag
Private Class Methods
client()
click to toggle source
# File lib/jekyll-gist/gist_tag.rb, line 121 def self.client @client ||= Octokit::Client.new :access_token => ENV["JEKYLL_GITHUB_TOKEN"] end
Public Instance Methods
render(context)
click to toggle source
# File lib/jekyll-gist/gist_tag.rb, line 13 def render(context) @encoding = context.registers[:site].config["encoding"] || "utf-8" @settings = context.registers[:site].config["gist"] if (tag_contents = determine_arguments(@markup.strip)) gist_id = tag_contents[0] filename = tag_contents[1] if context_contains_key?(context, gist_id) gist_id = context[gist_id] end if context_contains_key?(context, filename) filename = context[filename] end noscript_tag = gist_noscript_tag(gist_id, filename) script_tag = gist_script_tag(gist_id, filename) "#{noscript_tag}#{script_tag}" else raise ArgumentError, <<-EOS Syntax error in tag 'gist' while parsing the following markup: #{@markup} Valid syntax: {% gist user/1234567 %} {% gist user/1234567 foo.js %} {% gist 28949e1d5ee2273f9fd3 %} {% gist 28949e1d5ee2273f9fd3 best.md %} EOS end end
Private Instance Methods
code_from_api(gist_id, filename = nil)
click to toggle source
# File lib/jekyll-gist/gist_tag.rb, line 104 def code_from_api(gist_id, filename = nil) gist = GistTag.client.gist gist_id file = if filename.to_s.empty? # No file specified, return the value of the first key/value pair gist.files.first[1] else # .files is a hash of :"filename.extension" => data pairs # Rather than using to_sym on arbitrary user input, # Find our file by calling to_s on the keys match = gist.files.find { |name, _data| name.to_s == filename } match[1] if match end file[:content] if file end
context_contains_key?(context, key)
click to toggle source
# File lib/jekyll-gist/gist_tag.rb, line 52 def context_contains_key?(context, key) if context.respond_to?(:has_key?) context.has_key?(key) else context.key?(key) end end
determine_arguments(input)
click to toggle source
# File lib/jekyll-gist/gist_tag.rb, line 45 def determine_arguments(input) matched = input.match(%r!\A([\S]+|.*(?=\/).+)\s?(\S*)\Z!) [matched[1].strip, matched[2].strip] if matched && matched.length >= 3 end
fetch_raw_code(gist_id, filename = nil)
click to toggle source
# File lib/jekyll-gist/gist_tag.rb, line 85 def fetch_raw_code(gist_id, filename = nil) return code_from_api(gist_id, filename) if ENV["JEKYLL_GITHUB_TOKEN"] url = "https://gist.githubusercontent.com/#{gist_id}/raw" url = "#{url}/#{filename}" unless filename.to_s.empty? uri = URI(url) Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == "https", :read_timeout => 3, :open_timeout => 3) do |http| request = Net::HTTP::Get.new uri.to_s response = http.request(request) response.body end rescue SocketError, Net::HTTPError, Net::OpenTimeout, Net::ReadTimeout, TimeoutError nil end
gist_noscript_tag(gist_id, filename = nil)
click to toggle source
# File lib/jekyll-gist/gist_tag.rb, line 66 def gist_noscript_tag(gist_id, filename = nil) return if @settings && @settings["noscript"] == false code = fetch_raw_code(gist_id, filename) if !code.nil? code = code.force_encoding(@encoding) code = CGI.escapeHTML(code) # CGI.escapeHTML behavior differs in Ruby < 2.0 # See https://github.com/jekyll/jekyll-gist/pull/28 code = code.gsub("'", "'") if RUBY_VERSION < "2.0" "<noscript><pre>#{code}</pre></noscript>" else Jekyll.logger.warn "Warning:", "The <noscript> tag for your gist #{gist_id} " Jekyll.logger.warn "", "could not be generated. This will affect users who do " Jekyll.logger.warn "", "not have JavaScript enabled in their browsers." end end
gist_script_tag(gist_id, filename = nil)
click to toggle source
# File lib/jekyll-gist/gist_tag.rb, line 60 def gist_script_tag(gist_id, filename = nil) url = "https://gist.github.com/#{gist_id}.js" url = "#{url}?file=#{filename}" unless filename.to_s.empty? "<script src=\"#{url}\"> </script>" end