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 +15 -0
- data/.gitignore +21 -0
- data/.rspec +2 -0
- data/.travis.yml +4 -0
- data/CHANGELOG.md +4 -0
- data/Gemfile +5 -0
- data/LICENSE.txt +22 -0
- data/README.md +83 -0
- data/Rakefile +7 -0
- data/lib/octopress-gist.rb +19 -0
- data/lib/octopress-gist/cache.rb +27 -0
- data/lib/octopress-gist/gist-no-cache.rb +10 -0
- data/lib/octopress-gist/gist.rb +87 -0
- data/lib/octopress-gist/version.rb +5 -0
- data/octopress-gist.gemspec +25 -0
- data/test/.gitignore +1 -0
- data/test/Gemfile +11 -0
- data/test/_config.yml +8 -0
- data/test/expected/index.html +149 -0
- data/test/expected/textile-test.html +140 -0
- data/test/site/index.html +149 -0
- data/test/site/textile-test.html +140 -0
- data/test/source/_layouts/default.html +44 -0
- data/test/source/_plugins/bundler.rb +3 -0
- data/test/source/index.md +6 -0
- data/test/source/textile-test.textile +6 -0
- data/test/test.rb +39 -0
- metadata +140 -0
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
data/.travis.yml
ADDED
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
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
|
+
[](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,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,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,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
data/test/_config.yml
ADDED
@@ -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">'guard'</span>
|
25
|
+
</div><div class='line'><span class="nb">require</span> <span class="s1">'guard/guard'</span>
|
26
|
+
</div><div class='line'> </div><div class='line'><span class="nb">require</span> <span class="s1">'jekyll'</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"><</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">=></span> <span class="o">[]</span><span class="p">,</span>
|
33
|
+
</div><div class='line'> <span class="ss">:config</span> <span class="o">=></span> <span class="s1">'_config.yml'</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">'md'</span><span class="p">,</span><span class="s1">'markdown'</span><span class="p">,</span><span class="s1">'textile'</span><span class="p">,</span><span class="s1">'html'</span><span class="p">,</span><span class="s1">'haml'</span><span class="p">,</span><span class="s1">'slim'</span><span class="p">,</span><span class="s1">'xml'</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">'source'</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">'destination'</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"><<</span> <span class="s1">'$'</span><span class="p">)</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="s1">'\.'</span><span class="p">,</span> <span class="s1">'\\.'</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">'|'</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">'Guard::Jekyll is watching for file changes'</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">></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'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">"</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">"</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">"Guard::Jekyll"</span> <span class="o">+</span> <span class="s2">" copied "</span><span class="o">.</span><span class="n">yellow</span> <span class="o">+</span> <span class="s2">"</span><span class="si">#{</span><span class="n">file</span><span class="si">}</span><span class="s2"> -> </span><span class="si">#{</span><span class="n">destination_file</span><span class="si">}</span><span class="s2">"</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">"Guard::Jekyll"</span> <span class="o">+</span> <span class="s2">" delete "</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">'/*'</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">"Guard::Jekyll"</span> <span class="o">+</span> <span class="s2">" delete "</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">=></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">"Guard::Jekyll"</span> <span class="o">+</span> <span class="s2">" failed "</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">"Guard::Jekyll "</span><span class="o">+</span><span class="s2">" building"</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">"Guard::Jekyll "</span><span class="o">+</span><span class="s2">" complete"</span><span class="o">.</span><span class="n">green</span> <span class="o">+</span> <span class="s2">" 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">/"</span>
|
114
|
+
</div><div class='line'> </div><div class='line'> <span class="k">rescue</span> <span class="no">Exception</span> <span class="o">=></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">"Guard::Jekyll failed"</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">'guards/guard-jekyll-plus.rb'</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">'_config.yml'</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>
|