Метка жидкость для показа на GitHub gists с тега NoScript теги в Джекил пост


Некоторое время назад я написал жидкости тег для Джекилла , который вставляет содержимое на GitHub суть в содержании страницы в

(Очевидно, некоторых внутренних органов, касающихся методов, необходимых, чтобы сделать жидкое теги работают (например, параметры инициализации и имея оказывают метод) не подлежат обсуждению, но вы получите идею.)

require 'digest/md5'
require 'net/https'
require 'uri'

module Jekyll
  class GistTag < Liquid::Tag
    def initialize(tag_name, text, token)
      super
      @text         = text
      @cache        = true
      @cache_folder = File.expand_path "../_gist_cache", File.dirname(__FILE__)
    end

    def render(context)
      return "" unless @text =~ /([\d]*) (.*)/

      gist, file = $1.strip, $2.strip
      script_url = "https://gist.github.com/#{gist}.js?file=#{file}"

      code       = get_cached_gist(gist, file) || get_gist_from_web(gist, file)
      code       = code.gsub "<", "&lt;"
      string     = "<script src='#{script_url}'></script>"
      string    += "<noscript><pre><code>#{code}
" возвращает строку конец деф get_gist_url_for(корень, файл) "https://gist.github.com/raw/#{сущность}/#{файл}" конец деф cache_gist(Гист, Файл, Сведения) файл = Гист get_cache_file_for, файл Файл.открыть(файл, "ж+") сделать |Ф| Ф.записи(данные) конец конец деф get_cached_gist(корень, файл) возвращает nil, если @кэше == ложь файл = Гист get_cache_file_for, файл возвращает nil, если файл.существует?(файл) вернуть файл.новый(файл).читать конец деф get_cache_file_for(корень, файл) bad_chars = /[^а-Яа-З0-9\-_\.]/ суть = суть.bad_chars gsub, " файл = файл.bad_chars gsub, " алгоритм MD5 = дайджест::алгоритм MD5.hexdigest "#{суть}-#{файл}" Файл.присоединяйтесь к @cache_folder, "#{сущность}-#{файл}-#{алгоритм MD5}.кэш" конец деф get_gist_from_web(корень, файл) gist_url = get_gist_url_for(корень, файл) raw_uri = Ури.разобрать(gist_url) протоколу HTTPS = нетто: сайт:http.новый(raw_uri.хозяин, raw_uri.порт) протоколу HTTPS.use_ssl = истина протоколу HTTPS.verify_mode = в OpenSSL::SSL-шифрование::VERIFY_NONE запрос = сеть::НТТР::сделать.новый(raw_uri.request_uri) данных = по протоколу HTTPS.запрос(запрос) данные = данные.тело cache_gist(Гист, файл, данные) если @кэше == ложь данные конец конец GistTagNoCache класс <GistTag деф инициализировать(tag_name, текст, маркер) супер @кэш = ложь конец конец конец Жидкость::Шаблон.register_tag('суть', Джекилл::GistTag) Жидкость::Шаблон.register_tag('gistnocache', Джекилл::GistTagNoCache)


380
3
задан 12 марта 2011 в 06:03 Источник Поделиться
Комментарии
1 ответ

Пару в основном небольшие заметки и улучшения:

return "" unless @text =~ /([\d]*) (.*)/
gist, file = $1.strip, $2.strip

Я вообще стараюсь избегать магии переменных, где это возможно. Используя матче и в результате MatchData объект имеет тенденцию быть менее подверженным ошибкам.


code       = code.gsub "<", "&lt;"

Есть причина, по которой вы только избежать < персонажи? Если я что-то упускаю, представляется целесообразным использовать в CGI.escapeHTML вместо этого.


return string

Это кажется несовместимым со мной, что в некоторых методах вы вернуть заявление в последней строке, а в других вам не надо. Я всегда оставляю на возврат заявление в последней строке как ненужную.


return nil if @cache == false

Это довольно unidiomatic использовать == с булевыми литералами - обычно можно было бы просто отменяет логическое вместо сравнения ложны. если !@кэш или лучше , если @кэш будет читать более естественным для большинства людей, чем если @кэше == ложь.


File.new(file).read

Вы никогда не должны использовать файл.новый без сохранения возвращаемого значения где-то, а потом звонит закрыть на это. Как на самом деле в большинстве случаев вы не должны использовать файл.новый вообще, а файл.откройте блок, который закрывает файл автоматически, когда блок не будет достигнут конец. Путь вы делаете это дескриптор файла будет оставаться открытым до тех пор, пока файл объекта мусора, которые могут быть некоторое время. Это плохая практика и может привести к тонкие проблемы.

Однако в этом случае вам даже не нужен файл.открыть как там уже есть метод, который делает именно то, что вам нужно: файл.прочитать(файл).


gist.gsub! /[^a-zA-Z0-9\-_\.]/, ''

Вам не нужно бежать . как это не имеет особого значения в скобках.


cache_gist(gist, file, data) unless @cache == false

Это действительно было бы гораздо более читаемым без явного сравнения и двойным отрицанием:

cache_gist(gist, file, data) if @cache

3
ответ дан 12 марта 2011 в 09:03 Источник Поделиться