octopress-gist 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZjhkYTE3ZjViNWEwOTZjMmY3ODNhYzJlMjM2OTFhODI1ZGI0MzIyNg==
5
+ data.tar.gz: !binary |-
6
+ ZTliNTIzZDcwZmNkZWEyNzg0NzU3MmMzNDE4MWZmN2Q1M2VmMjc1Mg==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ ZTFlYWZkNDVhZTEyYTdjOTNiMWY2MDA4MWNmMzM1N2Y4NzQ0YWI5NDkzMDU3
10
+ OTc2NTc5MTNiYTNiOGE0ZTFhMDVlYzVjZjI0ZTVhOWIzNzZlMDE3ZjRkMjA2
11
+ MDg1MTFiODQ5MDVhNjkzYjFiNWQzMzJjNzY2Njk2NmVjNzgyMmQ=
12
+ data.tar.gz: !binary |-
13
+ MTdhYjI1NTAwZWJkMDY0ZDZmMGFlODZmZDNmMTcxNTA2ZDkxNWU0ZmFlZGVm
14
+ YWM2MzcxYzJhMGMxOTM1YjBlMGUyNGZmODIxNjFmYzdhNGExOWFkZTVkNjI2
15
+ Y2U0MGI5YjU3ZjIxYWU4OGFkYWVmODBjNTM1MDcwNjVmMzgzM2Q=
data/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .DS_Store
19
+ .pygments-cache
20
+ _site
21
+ .gist-cache
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ - 1.9.3
data/CHANGELOG.md ADDED
@@ -0,0 +1,4 @@
1
+ # Changelog
2
+
3
+ ## 1.0.0
4
+ - Initial release
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in jekyll-minify-html.gemspec
4
+ gemspec
5
+
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Brandon Mathis
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,83 @@
1
+ # Octopress Gist
2
+
3
+ Embed GitHub Gists in your Jekyll or Octopress blog.
4
+
5
+ [![Build Status](https://travis-ci.org/octopress/octopress-gist.png?branch=master)](https://travis-ci.org/octopress/octopress-gist)
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile under
10
+ the :jekyll_plugins group:
11
+
12
+ ```ruby
13
+ group :jekyll_plugins do
14
+ gem 'octopress-gist'
15
+ end
16
+ ```
17
+
18
+ And then execute:
19
+
20
+ $ bundle
21
+
22
+ Next add this to your plugins folder to automatically load any Jekyll plugins in your :jekyll_plugins group.
23
+
24
+ ```ruby
25
+ # in _plugins/bundler.rb
26
+ require "bundler/setup"
27
+ Bundler.require(:jekyll_plugins)
28
+ ```
29
+
30
+ Or you can just create a ruby file in your Jekyll plugins directory with the line `require "octopress-gist"`
31
+
32
+ ## Usage
33
+
34
+ The gist syntax looks like this.
35
+
36
+ ```
37
+ {% gist [gist_id] [file_name] [options] %}
38
+ ```
39
+
40
+ A simple gist embed:
41
+
42
+ ```
43
+ {% gist 5672127 %}
44
+ ```
45
+
46
+ This will download the gist and render it with Octopress Pygments, caching both the raw gist, and the highlighted code.
47
+
48
+ If your Gist has multile files, this will embed each file in it's own code figure.
49
+
50
+
51
+ #### Embed single files in a gist
52
+
53
+ If your Gist has multile files but you wish to embed files individually, you can like this.
54
+
55
+ ```
56
+ {% gist 13411532 some_gist_file_name.rb %}
57
+
58
+ Comments about this file
59
+
60
+ {% gist 13411532 some_gist_file_name2.rb %}
61
+
62
+ and so on...
63
+ ```
64
+
65
+ #### Disable Gist Caching
66
+
67
+ To disable caching, use the `gistnocache` tag instead.
68
+
69
+ ```
70
+ {% gistnocache 12512151 %}
71
+ ```
72
+
73
+ This works just like the normal tag, but forces a fresh download of your gist with each Jekyll build. If the gist is unchanged, the code highlighting will still use
74
+ Pygments caching to prevent unnecessary CPU effort.
75
+
76
+
77
+ ## Contributing
78
+
79
+ 1. Fork it
80
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
81
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
82
+ 4. Push to the branch (`git push origin my-new-feature`)
83
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
7
+ task :test => :spec
@@ -0,0 +1,19 @@
1
+ require 'liquid'
2
+ require 'octopress-pygments'
3
+ require 'open-uri'
4
+ require 'json'
5
+
6
+ $:.unshift File.dirname(__FILE__)
7
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
8
+
9
+ module Octopress
10
+ module Gist
11
+ autoload :Cache, 'octopress-gist/cache'
12
+ autoload :Tag, 'octopress-gist/gist'
13
+ autoload :NoCacheTag, 'octopress-gist/gist-no-cache'
14
+ end
15
+ end
16
+
17
+ Liquid::Template.register_tag('gist', Octopress::Gist::Tag)
18
+ Liquid::Template.register_tag('gistnocache', Octopress::Gist::NoCacheTag)
19
+
@@ -0,0 +1,27 @@
1
+ module Octopress
2
+ module Gist
3
+ class Cache
4
+ GIST_CACHE_DIR = '.gist-cache'
5
+
6
+ class << self
7
+
8
+ def read_cache(options)
9
+ path = get_cache_path(GIST_CACHE_DIR, options[:gist_id], options.to_s)
10
+ File.exist?(path) ? JSON.parse(File.read(path)) : nil
11
+ end
12
+
13
+ def write_cache(contents, options)
14
+ FileUtils.mkdir_p(GIST_CACHE_DIR) unless File.directory?(GIST_CACHE_DIR)
15
+ path = get_cache_path(GIST_CACHE_DIR, options[:gist_id], options.to_s)
16
+ File.open(path, 'w') do |f|
17
+ f.print(contents.to_s)
18
+ end
19
+ end
20
+
21
+ def get_cache_path(dir, name, str)
22
+ File.join(dir, "#{name}-#{Digest::MD5.hexdigest(str)}.html")
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,10 @@
1
+ module Octopress
2
+ module Gist
3
+ class NoCacheTag < Tag
4
+ def initialize(tag_name, markup, token)
5
+ super
6
+ @cache_disabled = true
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,87 @@
1
+ module Octopress
2
+ module Gist
3
+ class Tag < Liquid::Tag
4
+
5
+ def initialize(tag_name, markup, tokens)
6
+ super
7
+ @cache_disabled = false
8
+ @tag_name = tag_name
9
+ @markup = markup
10
+ end
11
+
12
+ def render(context)
13
+ if Pygments.clean_markup(@markup) =~ /([\S]*)\s*(\S*)/
14
+ gist_id, filename = $1.strip, $2.strip
15
+ filename = $2.strip == "" ? nil : $2.strip
16
+ options = {
17
+ gist_id: $1.strip,
18
+ cache: !@cache_disabled
19
+ }
20
+ options = Pygments.parse_markup(@markup, options)
21
+
22
+ if @cache_disabled or ! gist = Cache.read_cache(options)
23
+ gist = download_gist(options)
24
+ end
25
+
26
+ options[:url] ||= gist['html_url']
27
+ options[:link_text] ||= "View Gist"
28
+
29
+ output = []
30
+ gist_files(gist, filename).each do |file|
31
+ opt = {
32
+ title: file['filename'],
33
+ lang: file['language'].downcase
34
+ }.merge(options)
35
+ begin
36
+ code = Pygments.highlight(file['content'], opt)
37
+ code = "<notextile>#{code}</notextile>" if context.registers[:page]['path'].match(/textile/)
38
+ output << code
39
+ rescue MentosError => e
40
+ markup = "{% #{@tag_name} #{@markup.strip} %}"
41
+ Pygments.highlight_failed(e, "{% #{@tag_name} [gist_id] [file_name] [options...] %}", markup, file['content'])
42
+ end
43
+ end
44
+ output.join "\n"
45
+ else
46
+ error_msg = "Syntax Error: {% #{@tag_name} #{@markup.strip} %}"
47
+ syntax_msg = "Should be: {% #{@tag_name} [gistid] [file_name] [options...] %}"
48
+ puts error_msg.red
49
+ puts syntax_msg
50
+ "<pre>#{error_msg}\n#{syntax_msg}</pre>"
51
+ end
52
+ end
53
+
54
+ def gist_files(gist, filename=nil)
55
+ gists = gist['files']
56
+ # Return a single file if specified
57
+ if filename
58
+ if file = gists[filename]
59
+ [file]
60
+ else
61
+ # List file names found in the error message.
62
+ filenames = gists.keys.each { |k| k.to_s }
63
+ raise "File '#{filename}' not found in gist #{gist['id']}. Did you mean '#{filenames.join('\' or \'')}'?"
64
+ end
65
+ else
66
+ gists.values.each{ |v| v }
67
+ end
68
+ end
69
+
70
+ def download_gist(options)
71
+ retried = false
72
+ begin
73
+ response = URI.parse("https://api.github.com/gists/#{options[:gist_id]}").read
74
+ Cache.write_cache(response, options) if options[:cache]
75
+ JSON.parse(response)
76
+ rescue => e
77
+ raise if retried
78
+ retried = true
79
+ retry
80
+ end
81
+ rescue => e
82
+ puts "Failed to download Gist: #{gist}.".red
83
+ puts e.extend Error
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,5 @@
1
+ module Octopress
2
+ module Gist
3
+ VERSION = "1.0.0"
4
+ end
5
+ end
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'octopress-gist/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "octopress-gist"
8
+ gem.version = Octopress::Gist::VERSION
9
+ gem.authors = ["Brandon Mathis"]
10
+ gem.email = ["brandon@imathis.com"]
11
+ gem.description = %q{Embed GitHub gists, support caching, and multiple files per gist.}
12
+ gem.summary = %q{Embed GitHub gists, support caching, and multiple files per gist.}
13
+ gem.homepage = "https://github.com/octopress/octopress-gist"
14
+ gem.license = "MIT"
15
+
16
+ gem.add_runtime_dependency 'octopress-pygments', '~> 1.2.3'
17
+ gem.add_runtime_dependency 'liquid', '~> 2.5.0'
18
+ gem.add_runtime_dependency 'json'
19
+
20
+ gem.add_development_dependency 'rake'
21
+ gem.add_development_dependency 'rspec'
22
+
23
+ gem.files = `git ls-files`.split($/)
24
+ gem.require_paths = ["lib"]
25
+ end
data/test/.gitignore ADDED
@@ -0,0 +1 @@
1
+ _site
data/test/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in jekyll-markdown-block.gemspec
4
+ group :jekyll_plugins do
5
+ gem "octopress-gist", path: "../../"
6
+ end
7
+
8
+ gem "colorator"
9
+ gem "redcarpet"
10
+ gem "RedCloth"
11
+ gem "jekyll", "~> 1.0.0"
data/test/_config.yml ADDED
@@ -0,0 +1,8 @@
1
+ name: Your New Jekyll Site
2
+ markdown: redcarpet
3
+ redcarpet:
4
+ smart: false
5
+ source: source
6
+ plugins: source/_plugins
7
+ destination: site
8
+ pygments: false
@@ -0,0 +1,149 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
6
+ <title>Your New Jekyll Site</title>
7
+ <meta name="viewport" content="width=device-width">
8
+
9
+ <!-- syntax highlighting CSS -->
10
+ <link rel="stylesheet" href="/css/syntax.css">
11
+
12
+ <!-- Custom CSS -->
13
+ <link rel="stylesheet" href="/css/main.css">
14
+
15
+ </head>
16
+ <body>
17
+
18
+ <div class="site">
19
+ <div class="header">
20
+ <h1 class="title"><a href="/">Your New Jekyll Site</a></h1>
21
+ <a class="extra" href="/">home</a>
22
+ </div>
23
+
24
+ <figure class='code'><figcaption>guard-jekyll-plus.rb<a href='https://gist.github.com/5946651'>link</a></figcaption><div class='highlight'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='0' class='line-number'></div><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div><div data-line='33' class='line-number'></div><div data-line='34' class='line-number'></div><div data-line='35' class='line-number'></div><div data-line='36' class='line-number'></div><div data-line='37' class='line-number'></div><div data-line='38' class='line-number'></div><div data-line='39' class='line-number'></div><div data-line='40' class='line-number'></div><div data-line='41' class='line-number'></div><div data-line='42' class='line-number'></div><div data-line='43' class='line-number'></div><div data-line='44' class='line-number'></div><div data-line='45' class='line-number'></div><div data-line='46' class='line-number'></div><div data-line='47' class='line-number'></div><div data-line='48' class='line-number'></div><div data-line='49' class='line-number'></div><div data-line='50' class='line-number'></div><div data-line='51' class='line-number'></div><div data-line='52' class='line-number'></div><div data-line='53' class='line-number'></div><div data-line='54' class='line-number'></div><div data-line='55' class='line-number'></div><div data-line='56' class='line-number'></div><div data-line='57' class='line-number'></div><div data-line='58' class='line-number'></div><div data-line='59' class='line-number'></div><div data-line='60' class='line-number'></div><div data-line='61' class='line-number'></div><div data-line='62' class='line-number'></div><div data-line='63' class='line-number'></div><div data-line='64' class='line-number'></div><div data-line='65' class='line-number'></div><div data-line='66' class='line-number'></div><div data-line='67' class='line-number'></div><div data-line='68' class='line-number'></div><div data-line='69' class='line-number'></div><div data-line='70' class='line-number'></div><div data-line='71' class='line-number'></div><div data-line='72' class='line-number'></div><div data-line='73' class='line-number'></div><div data-line='74' class='line-number'></div><div data-line='75' class='line-number'></div><div data-line='76' class='line-number'></div><div data-line='77' class='line-number'></div><div data-line='78' class='line-number'></div><div data-line='79' class='line-number'></div><div data-line='80' class='line-number'></div><div data-line='81' class='line-number'></div><div data-line='82' class='line-number'></div><div data-line='83' class='line-number'></div><div data-line='84' class='line-number'></div><div data-line='85' class='line-number'></div><div data-line='86' class='line-number'></div><div data-line='87' class='line-number'></div><div data-line='88' class='line-number'></div><div data-line='89' class='line-number'></div><div data-line='90' class='line-number'></div><div data-line='91' class='line-number'></div><div data-line='92' class='line-number'></div><div data-line='93' class='line-number'></div><div data-line='94' class='line-number'></div><div data-line='95' class='line-number'></div><div data-line='96' class='line-number'></div><div data-line='97' class='line-number'></div><div data-line='98' class='line-number'></div><div data-line='99' class='line-number'></div><div data-line='100' class='line-number'></div><div data-line='101' class='line-number'></div><div data-line='102' class='line-number'></div><div data-line='103' class='line-number'></div><div data-line='104' class='line-number'></div><div data-line='105' class='line-number'></div><div data-line='106' class='line-number'></div><div data-line='107' class='line-number'></div><div data-line='108' class='line-number'></div><div data-line='109' class='line-number'></div><div data-line='110' class='line-number'></div><div data-line='111' class='line-number'></div><div data-line='112' class='line-number'></div><div data-line='113' class='line-number'></div><div data-line='114' class='line-number'></div><div data-line='115' class='line-number'></div><div data-line='116' class='line-number'></div><div data-line='117' class='line-number'></div><div data-line='118' class='line-number'></div></pre></td><td class='main ruby'><pre><div class='line'><span class="nb">require</span> <span class="s1">&#39;guard&#39;</span>
25
+ </div><div class='line'><span class="nb">require</span> <span class="s1">&#39;guard/guard&#39;</span>
26
+ </div><div class='line'> </div><div class='line'><span class="nb">require</span> <span class="s1">&#39;jekyll&#39;</span>
27
+ </div><div class='line'> </div><div class='line'><span class="k">module</span> <span class="nn">Guard</span>
28
+ </div><div class='line'> <span class="k">class</span> <span class="nc">Jekyll</span> <span class="o">&lt;</span> <span class="no">Guard</span>
29
+ </div><div class='line'> </div><div class='line'> <span class="k">def</span> <span class="nf">initialize</span> <span class="p">(</span><span class="n">watchers</span><span class="o">=[]</span><span class="p">,</span> <span class="n">options</span><span class="o">=</span><span class="p">{})</span>
30
+ </div><div class='line'> <span class="k">super</span>
31
+ </div><div class='line'> </div><div class='line'> <span class="vi">@options</span> <span class="o">=</span> <span class="p">{</span>
32
+ </div><div class='line'> <span class="ss">:extensions</span> <span class="o">=&gt;</span> <span class="o">[]</span><span class="p">,</span>
33
+ </div><div class='line'> <span class="ss">:config</span> <span class="o">=&gt;</span> <span class="s1">&#39;_config.yml&#39;</span>
34
+ </div><div class='line'> <span class="p">}</span><span class="o">.</span><span class="n">merge</span><span class="p">(</span><span class="n">options</span><span class="p">)</span>
35
+ </div><div class='line'> </div><div class='line'> <span class="n">default_extensions</span> <span class="o">=</span> <span class="o">[</span><span class="s1">&#39;md&#39;</span><span class="p">,</span><span class="s1">&#39;markdown&#39;</span><span class="p">,</span><span class="s1">&#39;textile&#39;</span><span class="p">,</span><span class="s1">&#39;html&#39;</span><span class="p">,</span><span class="s1">&#39;haml&#39;</span><span class="p">,</span><span class="s1">&#39;slim&#39;</span><span class="p">,</span><span class="s1">&#39;xml&#39;</span><span class="o">]</span>
36
+ </div><div class='line'> </div><div class='line'> <span class="n">config</span> <span class="o">=</span> <span class="o">::</span><span class="no">Jekyll</span><span class="o">.</span><span class="n">configuration</span><span class="p">(</span><span class="n">options</span><span class="p">)</span>
37
+ </div><div class='line'> <span class="vi">@site</span> <span class="o">=</span> <span class="o">::</span><span class="ss">Jekyll</span><span class="p">:</span><span class="ss">:Site</span><span class="o">.</span><span class="n">new</span> <span class="n">config</span>
38
+ </div><div class='line'> </div><div class='line'> <span class="vi">@options</span><span class="o">[</span><span class="ss">:source</span><span class="o">]</span> <span class="o">=</span> <span class="n">config</span><span class="o">[</span><span class="s1">&#39;source&#39;</span><span class="o">]</span>
39
+ </div><div class='line'> <span class="vi">@options</span><span class="o">[</span><span class="ss">:destination</span><span class="o">]</span> <span class="o">=</span> <span class="n">config</span><span class="o">[</span><span class="s1">&#39;destination&#39;</span><span class="o">]</span>
40
+ </div><div class='line'> <span class="vi">@options</span><span class="o">[</span><span class="ss">:extensions</span><span class="o">]</span> <span class="o">=</span> <span class="vi">@options</span><span class="o">[</span><span class="ss">:extensions</span><span class="o">].</span><span class="n">concat</span><span class="p">(</span><span class="n">default_extensions</span><span class="p">)</span><span class="o">.</span><span class="n">flatten</span><span class="o">.</span><span class="n">uniq</span>
41
+ </div><div class='line'> </div><div class='line'> <span class="c1"># Convert array of extensions into a regex for matching file extensions eg, /\.md$|\.markdown$|\.html$/i</span>
42
+ </div><div class='line'> <span class="vi">@extensions</span> <span class="o">=</span> <span class="no">Regexp</span><span class="o">.</span><span class="n">new</span> <span class="vi">@options</span><span class="o">[</span><span class="ss">:extensions</span><span class="o">].</span><span class="n">map</span> <span class="p">{</span> <span class="o">|</span><span class="n">e</span><span class="o">|</span> <span class="p">(</span><span class="n">e</span> <span class="o">&lt;&lt;</span> <span class="s1">&#39;$&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="s1">&#39;\.&#39;</span><span class="p">,</span> <span class="s1">&#39;\\.&#39;</span><span class="p">)</span> <span class="p">}</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s1">&#39;|&#39;</span><span class="p">),</span> <span class="kp">true</span>
43
+ </div><div class='line'> </div><div class='line'> <span class="k">end</span>
44
+ </div><div class='line'> </div><div class='line'> <span class="c1"># Calls #run_all if the :all_on_start option is present.</span>
45
+ </div><div class='line'> <span class="k">def</span> <span class="nf">start</span>
46
+ </div><div class='line'> <span class="no">UI</span><span class="o">.</span><span class="n">info</span> <span class="s1">&#39;Guard::Jekyll is watching for file changes&#39;</span>
47
+ </div><div class='line'> <span class="n">rebuild</span>
48
+ </div><div class='line'> <span class="k">end</span>
49
+ </div><div class='line'> </div><div class='line'> <span class="k">def</span> <span class="nf">reload</span>
50
+ </div><div class='line'> <span class="n">compile</span>
51
+ </div><div class='line'> <span class="k">end</span>
52
+ </div><div class='line'> </div><div class='line'> <span class="k">def</span> <span class="nf">run_all</span>
53
+ </div><div class='line'> <span class="n">rebuild</span>
54
+ </div><div class='line'> <span class="k">end</span>
55
+ </div><div class='line'> </div><div class='line'> <span class="k">def</span> <span class="nf">run_on_changes</span><span class="p">(</span><span class="n">paths</span><span class="p">)</span>
56
+ </div><div class='line'> <span class="n">matches</span> <span class="o">=</span> <span class="o">[]</span>
57
+ </div><div class='line'> <span class="n">copy_files</span> <span class="o">=</span> <span class="o">[]</span>
58
+ </div><div class='line'> <span class="n">remove_files</span> <span class="o">=</span> <span class="o">[]</span>
59
+ </div><div class='line'> <span class="n">paths</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">file</span><span class="o">|</span>
60
+ </div><div class='line'> <span class="k">if</span> <span class="no">File</span><span class="o">.</span><span class="n">exist?</span> <span class="n">file</span>
61
+ </div><div class='line'> <span class="k">if</span> <span class="n">file</span> <span class="o">=~</span> <span class="vi">@extensions</span> <span class="ow">or</span> <span class="n">file</span> <span class="o">!=~</span> <span class="sr">/^</span><span class="si">#{</span><span class="vi">@options</span><span class="o">[</span><span class="ss">:source</span><span class="o">]</span><span class="si">}</span><span class="sr">/</span>
62
+ </div><div class='line'> <span class="n">matches</span><span class="o">.</span><span class="n">push</span> <span class="n">file</span>
63
+ </div><div class='line'> <span class="k">else</span>
64
+ </div><div class='line'> <span class="n">copy_files</span><span class="o">.</span><span class="n">push</span> <span class="n">file</span>
65
+ </div><div class='line'> <span class="k">end</span>
66
+ </div><div class='line'> <span class="k">else</span>
67
+ </div><div class='line'> <span class="n">remove_files</span><span class="o">.</span><span class="n">push</span> <span class="n">file</span>
68
+ </div><div class='line'> <span class="k">end</span>
69
+ </div><div class='line'> <span class="k">end</span>
70
+ </div><div class='line'> </div><div class='line'> <span class="k">if</span> <span class="n">matches</span><span class="o">.</span><span class="n">length</span> <span class="o">&gt;</span> <span class="mi">0</span>
71
+ </div><div class='line'> <span class="n">rebuild</span>
72
+ </div><div class='line'> <span class="k">else</span>
73
+ </div><div class='line'> <span class="c1"># If changes don&#39;t trigger Jekyll extension matches</span>
74
+ </div><div class='line'> <span class="c1"># manually copy and remove changed files</span>
75
+ </div><div class='line'> <span class="n">copy_files</span><span class="o">.</span><span class="n">each</span> <span class="p">{</span> <span class="o">|</span><span class="n">f</span><span class="o">|</span> <span class="n">copy</span> <span class="n">f</span> <span class="p">}</span>
76
+ </div><div class='line'> <span class="n">remove_files</span><span class="o">.</span><span class="n">each</span> <span class="p">{</span> <span class="o">|</span><span class="n">f</span><span class="o">|</span> <span class="n">remove</span> <span class="n">f</span> <span class="p">}</span>
77
+ </div><div class='line'> <span class="k">end</span>
78
+ </div><div class='line'> <span class="k">end</span>
79
+ </div><div class='line'> </div><div class='line'> <span class="kp">private</span>
80
+ </div><div class='line'> </div><div class='line'> <span class="k">def</span> <span class="nf">destination_path</span><span class="p">(</span><span class="n">file</span><span class="p">)</span>
81
+ </div><div class='line'> <span class="n">file</span><span class="o">.</span><span class="n">sub</span> <span class="sr">/^</span><span class="si">#{</span><span class="vi">@options</span><span class="o">[</span><span class="ss">:source</span><span class="o">]</span><span class="si">}</span><span class="sr">/</span><span class="p">,</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="vi">@options</span><span class="o">[</span><span class="ss">:destination</span><span class="o">]</span><span class="si">}</span><span class="s2">&quot;</span>
82
+ </div><div class='line'> <span class="k">end</span>
83
+ </div><div class='line'> </div><div class='line'> <span class="k">def</span> <span class="nf">copy</span><span class="p">(</span><span class="n">file</span><span class="p">)</span>
84
+ </div><div class='line'> <span class="n">destination_file</span> <span class="o">=</span> <span class="n">destination_path</span> <span class="n">file</span>
85
+ </div><div class='line'> <span class="no">FileUtils</span><span class="o">.</span><span class="n">mkdir_p</span> <span class="no">File</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">destination_file</span><span class="p">)</span>
86
+ </div><div class='line'> <span class="no">FileUtils</span><span class="o">.</span><span class="n">cp</span> <span class="n">file</span><span class="p">,</span> <span class="n">destination_file</span>
87
+ </div><div class='line'> <span class="no">UI</span><span class="o">.</span><span class="n">info</span> <span class="s2">&quot;Guard::Jekyll&quot;</span> <span class="o">+</span> <span class="s2">&quot; copied &quot;</span><span class="o">.</span><span class="n">yellow</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">file</span><span class="si">}</span><span class="s2"> -&gt; </span><span class="si">#{</span><span class="n">destination_file</span><span class="si">}</span><span class="s2">&quot;</span>
88
+ </div><div class='line'> <span class="kp">true</span>
89
+ </div><div class='line'> <span class="k">end</span>
90
+ </div><div class='line'> </div><div class='line'> <span class="k">def</span> <span class="nf">remove</span><span class="p">(</span><span class="n">file</span><span class="p">)</span>
91
+ </div><div class='line'> <span class="n">destination_file</span> <span class="o">=</span> <span class="n">destination_path</span> <span class="n">file</span>
92
+ </div><div class='line'> <span class="k">if</span> <span class="no">File</span><span class="o">.</span><span class="n">exist?</span> <span class="n">destination_file</span>
93
+ </div><div class='line'> <span class="k">begin</span>
94
+ </div><div class='line'> <span class="c1"># Remove deleted source file from destination</span>
95
+ </div><div class='line'> <span class="no">FileUtils</span><span class="o">.</span><span class="n">rm</span> <span class="n">destination_file</span>
96
+ </div><div class='line'> <span class="no">UI</span><span class="o">.</span><span class="n">info</span> <span class="s2">&quot;Guard::Jekyll&quot;</span> <span class="o">+</span> <span class="s2">&quot; delete &quot;</span><span class="o">.</span><span class="n">red</span> <span class="o">+</span> <span class="n">destination_file</span>
97
+ </div><div class='line'> </div><div class='line'> <span class="c1"># Remove empty directories from destination</span>
98
+ </div><div class='line'> <span class="n">dir</span> <span class="o">=</span> <span class="no">File</span><span class="o">.</span><span class="n">dirname</span> <span class="n">destination_file</span>
99
+ </div><div class='line'> <span class="k">if</span> <span class="no">Dir</span><span class="o">[</span><span class="n">dir</span><span class="o">+</span><span class="s1">&#39;/*&#39;</span><span class="o">].</span><span class="n">empty?</span>
100
+ </div><div class='line'> <span class="no">FileUtils</span><span class="o">.</span><span class="n">rm_r</span><span class="p">(</span><span class="n">dir</span><span class="p">)</span>
101
+ </div><div class='line'> <span class="no">UI</span><span class="o">.</span><span class="n">info</span> <span class="s2">&quot;Guard::Jekyll&quot;</span> <span class="o">+</span> <span class="s2">&quot; delete &quot;</span><span class="o">.</span><span class="n">red</span> <span class="o">+</span> <span class="n">dir</span>
102
+ </div><div class='line'> <span class="k">end</span>
103
+ </div><div class='line'> <span class="k">rescue</span> <span class="no">Exception</span> <span class="o">=&gt;</span> <span class="n">e</span>
104
+ </div><div class='line'> <span class="no">UI</span><span class="o">.</span><span class="n">error</span> <span class="s2">&quot;Guard::Jekyll&quot;</span> <span class="o">+</span> <span class="s2">&quot; failed &quot;</span><span class="o">.</span><span class="n">red</span> <span class="o">+</span> <span class="n">e</span>
105
+ </div><div class='line'> <span class="kp">throw</span> <span class="ss">:task_has_failed</span>
106
+ </div><div class='line'> <span class="k">end</span>
107
+ </div><div class='line'> </div><div class='line'> <span class="k">end</span>
108
+ </div><div class='line'> <span class="kp">true</span>
109
+ </div><div class='line'> <span class="k">end</span>
110
+ </div><div class='line'> </div><div class='line'> <span class="k">def</span> <span class="nf">rebuild</span>
111
+ </div><div class='line'> <span class="no">UI</span><span class="o">.</span><span class="n">info</span> <span class="s2">&quot;Guard::Jekyll &quot;</span><span class="o">+</span><span class="s2">&quot; building&quot;</span><span class="o">.</span><span class="n">yellow</span>
112
+ </div><div class='line'> <span class="vi">@site</span><span class="o">.</span><span class="n">process</span>
113
+ </div><div class='line'> <span class="no">UI</span><span class="o">.</span><span class="n">info</span> <span class="s2">&quot;Guard::Jekyll &quot;</span><span class="o">+</span><span class="s2">&quot; complete&quot;</span><span class="o">.</span><span class="n">green</span> <span class="o">+</span> <span class="s2">&quot; site built in </span><span class="si">#{</span><span class="vi">@options</span><span class="o">[</span><span class="ss">:destination</span><span class="o">]</span><span class="si">}</span><span class="s2">/&quot;</span>
114
+ </div><div class='line'> </div><div class='line'> <span class="k">rescue</span> <span class="no">Exception</span> <span class="o">=&gt;</span> <span class="n">e</span>
115
+ </div><div class='line'> <span class="no">UI</span><span class="o">.</span><span class="n">error</span> <span class="s2">&quot;Guard::Jekyll failed&quot;</span>
116
+ </div><div class='line'> <span class="kp">throw</span> <span class="ss">:task_has_failed</span>
117
+ </div><div class='line'> <span class="k">end</span>
118
+ </div><div class='line'> </div><div class='line'> <span class="k">end</span>
119
+ </div><div class='line'><span class="k">end</span>
120
+ </div></pre></td></tr></table></div></figure>
121
+
122
+ <figure class='code'><figcaption>Guardfile<a href='https://gist.github.com/5946651'>link</a></figcaption><div class='highlight'><table><tr><td class='line-numbers' aria-hidden='true'><pre><div data-line='0' class='line-number'></div><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div></pre></td><td class='main ruby'><pre><div class='line'><span class="nb">require</span> <span class="s1">&#39;guards/guard-jekyll-plus.rb&#39;</span>
123
+ </div><div class='line'> </div><div class='line'><span class="c1"># Sample guard</span>
124
+ </div><div class='line'><span class="n">guard</span> <span class="ss">:jekyll</span> <span class="k">do</span>
125
+ </div><div class='line'> <span class="n">watch</span> <span class="sr">/^source/</span>
126
+ </div><div class='line'> <span class="n">watch</span> <span class="s1">&#39;_config.yml&#39;</span>
127
+ </div><div class='line'><span class="k">end</span>
128
+ </div></pre></td></tr></table></div></figure>
129
+
130
+
131
+ <div class="footer">
132
+ <div class="contact">
133
+ <p>
134
+ Your Name<br />
135
+ What You Are<br />
136
+ you@example.com
137
+ </p>
138
+ </div>
139
+ <div class="contact">
140
+ <p>
141
+ <a href="https://github.com/yourusername">github.com/yourusername</a><br />
142
+ <a href="https://twitter.com/yourusername">twitter.com/yourusername</a><br />
143
+ </p>
144
+ </div>
145
+ </div>
146
+ </div>
147
+
148
+ </body>
149
+ </html>