monad 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CONTRIBUTING.markdown +91 -0
- data/Gemfile +1 -1
- data/History.markdown +772 -0
- data/{README.md → README.markdown} +5 -2
- data/Rakefile +163 -1
- data/bin/monad +86 -30
- data/features/create_sites.feature +54 -25
- data/features/data.feature +65 -0
- data/features/data_sources.feature +10 -10
- data/features/drafts.feature +5 -5
- data/features/embed_filters.feature +10 -10
- data/features/include_tag.feature +48 -0
- data/features/markdown.feature +5 -5
- data/features/pagination.feature +38 -10
- data/features/permalinks.feature +31 -11
- data/features/post_data.feature +41 -41
- data/features/post_excerpts.feature +50 -0
- data/features/site_configuration.feature +47 -26
- data/features/site_data.feature +30 -24
- data/features/step_definitions/{monad_steps.rb → jekyll_steps.rb} +66 -52
- data/features/support/env.rb +27 -8
- data/lib/jekyll.rb +99 -0
- data/lib/jekyll/cleaner.rb +73 -0
- data/lib/{monad → jekyll}/command.rb +6 -6
- data/lib/{monad → jekyll}/commands/build.rb +9 -9
- data/lib/jekyll/commands/doctor.rb +67 -0
- data/lib/jekyll/commands/new.rb +67 -0
- data/lib/jekyll/commands/serve.rb +65 -0
- data/lib/{monad → jekyll}/configuration.rb +60 -18
- data/lib/{monad → jekyll}/converter.rb +1 -1
- data/lib/{monad → jekyll}/converters/identity.rb +1 -1
- data/lib/{monad → jekyll}/converters/markdown.rb +2 -2
- data/lib/jekyll/converters/markdown/kramdown_parser.rb +29 -0
- data/lib/{monad → jekyll}/converters/markdown/maruku_parser.rb +12 -8
- data/lib/{monad → jekyll}/converters/markdown/rdiscount_parser.rb +4 -2
- data/lib/{monad → jekyll}/converters/markdown/redcarpet_parser.rb +1 -1
- data/lib/{monad → jekyll}/converters/textile.rb +1 -1
- data/lib/{monad → jekyll}/convertible.rb +39 -17
- data/lib/{monad → jekyll}/core_ext.rb +22 -4
- data/lib/jekyll/deprecator.rb +36 -0
- data/lib/{monad → jekyll}/draft.rb +1 -1
- data/lib/{monad → jekyll}/drivers/json_driver.rb +1 -1
- data/lib/{monad → jekyll}/drivers/yaml_driver.rb +1 -1
- data/lib/{monad → jekyll}/errors.rb +1 -1
- data/lib/jekyll/excerpt.rb +113 -0
- data/lib/{monad → jekyll}/filters.rb +16 -6
- data/lib/{monad → jekyll}/generator.rb +1 -1
- data/lib/jekyll/generators/pagination.rb +214 -0
- data/lib/{monad → jekyll}/layout.rb +4 -1
- data/lib/{monad → jekyll}/mime.types +0 -0
- data/lib/{monad → jekyll}/page.rb +36 -39
- data/lib/{monad → jekyll}/plugin.rb +1 -1
- data/lib/{monad → jekyll}/post.rb +58 -123
- data/lib/jekyll/related_posts.rb +59 -0
- data/lib/{monad → jekyll}/site.rb +120 -123
- data/lib/{monad → jekyll}/static_file.rb +1 -1
- data/lib/jekyll/stevenson.rb +89 -0
- data/lib/jekyll/tags/gist.rb +48 -0
- data/lib/{monad → jekyll}/tags/highlight.rb +3 -3
- data/lib/jekyll/tags/include.rb +135 -0
- data/lib/{monad → jekyll}/tags/post_url.rb +8 -6
- data/lib/jekyll/url.rb +67 -0
- data/lib/monad.rb +36 -27
- data/lib/site_template/_config.yml +2 -1
- data/lib/site_template/_layouts/default.html +21 -23
- data/lib/site_template/_layouts/post.html +1 -1
- data/lib/site_template/_posts/{0000-00-00-welcome-to-monad.markdown.erb → 0000-00-00-welcome-to-jekyll.markdown.erb} +6 -6
- data/lib/site_template/css/main.css +22 -27
- data/lib/site_template/index.html +2 -2
- data/monad.gemspec +153 -52
- data/site/.gitignore +4 -0
- data/site/CNAME +1 -0
- data/site/README +1 -0
- data/site/_config.yml +6 -0
- data/site/_includes/analytics.html +32 -0
- data/site/_includes/docs_contents.html +16 -0
- data/site/_includes/docs_contents_mobile.html +23 -0
- data/site/_includes/docs_option.html +11 -0
- data/site/_includes/docs_ul.html +20 -0
- data/site/_includes/footer.html +15 -0
- data/site/_includes/header.html +18 -0
- data/site/_includes/news_contents.html +23 -0
- data/site/_includes/news_contents_mobile.html +11 -0
- data/site/_includes/news_item.html +24 -0
- data/site/_includes/primary-nav-items.html +14 -0
- data/site/_includes/section_nav.html +22 -0
- data/site/_includes/top.html +17 -0
- data/site/_layouts/default.html +12 -0
- data/site/_layouts/docs.html +23 -0
- data/site/_layouts/news.html +19 -0
- data/site/_layouts/news_item.html +27 -0
- data/site/_posts/2013-05-06-jekyll-1-0-0-released.markdown +23 -0
- data/site/_posts/2013-05-08-jekyll-1-0-1-released.markdown +27 -0
- data/site/_posts/2013-05-12-jekyll-1-0-2-released.markdown +28 -0
- data/site/_posts/2013-06-07-jekyll-1-0-3-released.markdown +25 -0
- data/site/_posts/2013-07-14-jekyll-1-1-0-released.markdown +27 -0
- data/site/_posts/2013-07-24-jekyll-1-1-1-released.markdown +31 -0
- data/site/_posts/2013-07-25-jekyll-1-0-4-released.markdown +20 -0
- data/site/_posts/2013-07-25-jekyll-1-1-2-released.markdown +20 -0
- data/site/_posts/2013-09-06-jekyll-1-2-0-released.markdown +23 -0
- data/site/_posts/2013-09-14-jekyll-1-2-1-released.markdown +19 -0
- data/site/css/gridism.css +110 -0
- data/site/css/normalize.css +1 -0
- data/site/css/pygments.css +70 -0
- data/site/css/style.css +946 -0
- data/site/docs/configuration.md +373 -0
- data/site/docs/contributing.md +128 -0
- data/site/docs/datafiles.md +63 -0
- data/site/docs/deployment-methods.md +109 -0
- data/site/docs/drafts.md +20 -0
- data/site/docs/extras.md +56 -0
- data/site/docs/frontmatter.md +180 -0
- data/site/docs/github-pages.md +91 -0
- data/site/docs/heroku.md +9 -0
- data/site/docs/history.md +722 -0
- data/site/docs/index.md +52 -0
- data/site/docs/installation.md +76 -0
- data/site/docs/migrations.md +257 -0
- data/site/docs/pages.md +86 -0
- data/site/docs/pagination.md +211 -0
- data/site/docs/permalinks.md +180 -0
- data/site/docs/plugins.md +508 -0
- data/site/docs/posts.md +181 -0
- data/site/docs/quickstart.md +32 -0
- data/site/docs/resources.md +46 -0
- data/site/docs/sites.md +29 -0
- data/site/docs/structure.md +190 -0
- data/site/docs/templates.md +319 -0
- data/site/docs/troubleshooting.md +150 -0
- data/site/docs/upgrading.md +146 -0
- data/site/docs/usage.md +63 -0
- data/site/docs/variables.md +322 -0
- data/site/favicon.png +0 -0
- data/site/feed.xml +36 -0
- data/site/freenode.txt +1 -0
- data/site/img/article-footer.png +0 -0
- data/site/img/footer-arrow.png +0 -0
- data/site/img/footer-logo.png +0 -0
- data/site/img/logo-2x.png +0 -0
- data/site/img/octojekyll.png +0 -0
- data/site/img/tube.png +0 -0
- data/site/img/tube1x.png +0 -0
- data/site/index.html +90 -0
- data/site/js/modernizr-2.5.3.min.js +4 -0
- data/site/news/index.html +10 -0
- data/site/news/releases/index.html +10 -0
- data/test/helper.rb +6 -3
- data/test/source/+/foo.md +7 -0
- data/test/source/_data/languages.yml +2 -0
- data/test/source/_data/members.yaml +7 -0
- data/test/source/_data/products.yml +4 -0
- data/test/source/_includes/params.html +7 -0
- data/test/source/_layouts/default.html +1 -1
- data/test/source/_layouts/post/simple.html +1 -0
- data/test/source/_plugins/dummy.rb +1 -1
- data/test/source/_posts/2013-01-02-post-excerpt.markdown +1 -1
- data/test/source/_posts/2013-07-22-post-excerpt-with-layout.markdown +23 -0
- data/test/source/_posts/2013-08-01-mkdn-extension.mkdn +0 -0
- data/test/source/deal.with.dots.html +1 -1
- data/test/source/products.yml +4 -0
- data/test/test_configuration.rb +46 -11
- data/test/test_convertible.rb +2 -2
- data/test/test_excerpt.rb +78 -0
- data/test/test_filters.rb +4 -4
- data/test/test_generated_site.rb +13 -13
- data/test/test_json_driver.rb +9 -9
- data/test/test_kramdown.rb +32 -5
- data/test/test_new_command.rb +8 -8
- data/test/test_page.rb +12 -3
- data/test/test_pager.rb +34 -33
- data/test/test_post.rb +34 -26
- data/test/test_redcloth.rb +3 -3
- data/test/test_related_posts.rb +47 -0
- data/test/test_site.rb +102 -44
- data/test/test_tags.rb +168 -23
- data/test/test_url.rb +28 -0
- data/test/test_yaml_driver.rb +6 -6
- metadata +215 -137
- data/lib/monad/commands/doctor.rb +0 -29
- data/lib/monad/commands/new.rb +0 -50
- data/lib/monad/commands/serve.rb +0 -33
- data/lib/monad/converters/markdown/kramdown_parser.rb +0 -44
- data/lib/monad/deprecator.rb +0 -32
- data/lib/monad/generators/pagination.rb +0 -143
- data/lib/monad/logger.rb +0 -54
- data/lib/monad/tags/gist.rb +0 -30
- data/lib/monad/tags/include.rb +0 -37
@@ -1,29 +0,0 @@
|
|
1
|
-
module Monad
|
2
|
-
module Commands
|
3
|
-
class Doctor < Command
|
4
|
-
class << self
|
5
|
-
def process(options)
|
6
|
-
site = Monad::Site.new(options)
|
7
|
-
site.read
|
8
|
-
|
9
|
-
unless deprecated_relative_permalinks(site)
|
10
|
-
Monad::Logger.info "Your test results", "are in. Everything looks fine."
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def deprecated_relative_permalinks(site)
|
15
|
-
contains_deprecated_pages = false
|
16
|
-
site.pages.each do |page|
|
17
|
-
if page.uses_relative_permalinks
|
18
|
-
Monad::Logger.warn "Deprecation:", "'#{page.path}' uses relative" +
|
19
|
-
" permalinks which will be deprecated in" +
|
20
|
-
" Monad v1.1 and beyond."
|
21
|
-
contains_deprecated_pages = true
|
22
|
-
end
|
23
|
-
end
|
24
|
-
contains_deprecated_pages
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
data/lib/monad/commands/new.rb
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
require 'erb'
|
2
|
-
|
3
|
-
module Monad
|
4
|
-
module Commands
|
5
|
-
class New < Command
|
6
|
-
def self.process(args)
|
7
|
-
raise ArgumentError.new('You must specify a path.') if args.empty?
|
8
|
-
|
9
|
-
new_blog_path = File.expand_path(args.join(" "), Dir.pwd)
|
10
|
-
FileUtils.mkdir_p new_blog_path
|
11
|
-
unless Dir["#{new_blog_path}/**/*"].empty?
|
12
|
-
Monad::Logger.error "Conflict:", "#{new_blog_path} exists and is not empty."
|
13
|
-
exit(1)
|
14
|
-
end
|
15
|
-
|
16
|
-
create_sample_files new_blog_path
|
17
|
-
|
18
|
-
File.open(File.expand_path(self.initialized_post_name, new_blog_path), "w") do |f|
|
19
|
-
f.write(self.scaffold_post_content(site_template))
|
20
|
-
end
|
21
|
-
puts "New monad site installed in #{new_blog_path}."
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.scaffold_post_content(template_site)
|
25
|
-
ERB.new(File.read(File.expand_path(scaffold_path, site_template))).result
|
26
|
-
end
|
27
|
-
|
28
|
-
# Internal: Gets the filename of the sample post to be created
|
29
|
-
#
|
30
|
-
# Returns the filename of the sample post, as a String
|
31
|
-
def self.initialized_post_name
|
32
|
-
"_posts/#{Time.now.strftime('%Y-%m-%d')}-welcome-to-monad.markdown"
|
33
|
-
end
|
34
|
-
|
35
|
-
private
|
36
|
-
def self.create_sample_files(path)
|
37
|
-
FileUtils.cp_r site_template + '/.', path
|
38
|
-
FileUtils.rm File.expand_path(scaffold_path, path)
|
39
|
-
end
|
40
|
-
|
41
|
-
def self.site_template
|
42
|
-
File.expand_path("../../site_template", File.dirname(__FILE__))
|
43
|
-
end
|
44
|
-
|
45
|
-
def self.scaffold_path
|
46
|
-
"_posts/0000-00-00-welcome-to-monad.markdown.erb"
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
data/lib/monad/commands/serve.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
module Monad
|
3
|
-
module Commands
|
4
|
-
class Serve < Command
|
5
|
-
def self.process(options)
|
6
|
-
require 'webrick'
|
7
|
-
include WEBrick
|
8
|
-
|
9
|
-
destination = options['destination']
|
10
|
-
|
11
|
-
FileUtils.mkdir_p(destination)
|
12
|
-
|
13
|
-
mime_types_file = File.expand_path('../mime.types', File.dirname(__FILE__))
|
14
|
-
mime_types = WEBrick::HTTPUtils::load_mime_types(mime_types_file)
|
15
|
-
|
16
|
-
# recreate NondisclosureName under utf-8 circumstance
|
17
|
-
fh_option = WEBrick::Config::FileHandler
|
18
|
-
fh_option[:NondisclosureName] = ['.ht*','~*']
|
19
|
-
|
20
|
-
s = HTTPServer.new(
|
21
|
-
:Port => options['port'],
|
22
|
-
:BindAddress => options['host'],
|
23
|
-
:MimeTypes => mime_types
|
24
|
-
)
|
25
|
-
|
26
|
-
s.mount(options['baseurl'], HTTPServlet::FileHandler, destination, fh_option)
|
27
|
-
t = Thread.new { s.start }
|
28
|
-
trap("INT") { s.shutdown }
|
29
|
-
t.join()
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,44 +0,0 @@
|
|
1
|
-
module Monad
|
2
|
-
module Converters
|
3
|
-
class Markdown
|
4
|
-
class KramdownParser
|
5
|
-
def initialize(config)
|
6
|
-
require 'kramdown'
|
7
|
-
@config = config
|
8
|
-
rescue LoadError
|
9
|
-
STDERR.puts 'You are missing a library required for Markdown. Please run:'
|
10
|
-
STDERR.puts ' $ [sudo] gem install kramdown'
|
11
|
-
raise FatalException.new("Missing dependency: kramdown")
|
12
|
-
end
|
13
|
-
|
14
|
-
def convert(content)
|
15
|
-
# Check for use of coderay
|
16
|
-
kramdown_configs = if @config['kramdown']['use_coderay']
|
17
|
-
base_kramdown_configs.merge({
|
18
|
-
:coderay_wrap => @config['kramdown']['coderay']['coderay_wrap'],
|
19
|
-
:coderay_line_numbers => @config['kramdown']['coderay']['coderay_line_numbers'],
|
20
|
-
:coderay_line_number_start => @config['kramdown']['coderay']['coderay_line_number_start'],
|
21
|
-
:coderay_tab_width => @config['kramdown']['coderay']['coderay_tab_width'],
|
22
|
-
:coderay_bold_every => @config['kramdown']['coderay']['coderay_bold_every'],
|
23
|
-
:coderay_css => @config['kramdown']['coderay']['coderay_css']
|
24
|
-
})
|
25
|
-
else
|
26
|
-
# not using coderay
|
27
|
-
base_kramdown_configs
|
28
|
-
end
|
29
|
-
Kramdown::Document.new(content, kramdown_configs).to_html
|
30
|
-
end
|
31
|
-
|
32
|
-
def base_kramdown_configs
|
33
|
-
{
|
34
|
-
:auto_ids => @config['kramdown']['auto_ids'],
|
35
|
-
:footnote_nr => @config['kramdown']['footnote_nr'],
|
36
|
-
:entity_output => @config['kramdown']['entity_output'],
|
37
|
-
:toc_levels => @config['kramdown']['toc_levels'],
|
38
|
-
:smart_quotes => @config['kramdown']['smart_quotes']
|
39
|
-
}
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
data/lib/monad/deprecator.rb
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
module Monad
|
2
|
-
class Deprecator
|
3
|
-
def self.process(args)
|
4
|
-
no_subcommand(args)
|
5
|
-
deprecation_message args, "--server", "The --server command has been replaced by the \
|
6
|
-
'serve' subcommand."
|
7
|
-
deprecation_message args, "--no-server", "To build Monad without launching a server, \
|
8
|
-
use the 'build' subcommand."
|
9
|
-
deprecation_message args, "--auto", "The switch '--auto' has been replaced with '--watch'."
|
10
|
-
deprecation_message args, "--no-auto", "To disable auto-replication, simply leave off \
|
11
|
-
the '--watch' switch."
|
12
|
-
deprecation_message args, "--pygments", "The 'pygments' setting can only be set in \
|
13
|
-
your config files."
|
14
|
-
deprecation_message args, "--paginate", "The 'paginate' setting can only be set in your \
|
15
|
-
config files."
|
16
|
-
deprecation_message args, "--url", "The 'url' setting can only be set in your config files."
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.no_subcommand(args)
|
20
|
-
if args.size > 0 && args.first =~ /^--/ && !%w[--help --version].include?(args.first)
|
21
|
-
Monad::Logger.error "Deprecation:", "Monad now uses subcommands instead of just \
|
22
|
-
switches. Run `monad help' to find out more."
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def self.deprecation_message(args, deprecated_argument, message)
|
27
|
-
if args.include?(deprecated_argument)
|
28
|
-
Monad::Logger.error "Deprecation:", message
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
@@ -1,143 +0,0 @@
|
|
1
|
-
module Monad
|
2
|
-
module Generators
|
3
|
-
class Pagination < Generator
|
4
|
-
# This generator is safe from arbitrary code execution.
|
5
|
-
safe true
|
6
|
-
|
7
|
-
# Generate paginated pages if necessary.
|
8
|
-
#
|
9
|
-
# site - The Site.
|
10
|
-
#
|
11
|
-
# Returns nothing.
|
12
|
-
def generate(site)
|
13
|
-
site.pages.dup.each do |page|
|
14
|
-
paginate(site, page) if Pager.pagination_enabled?(site.config, page)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
# Paginates the blog's posts. Renders the index.html file into paginated
|
19
|
-
# directories, e.g.: page2/index.html, page3/index.html, etc and adds more
|
20
|
-
# site-wide data.
|
21
|
-
#
|
22
|
-
# site - The Site.
|
23
|
-
# page - The index.html Page that requires pagination.
|
24
|
-
#
|
25
|
-
# {"paginator" => { "page" => <Number>,
|
26
|
-
# "per_page" => <Number>,
|
27
|
-
# "posts" => [<Post>],
|
28
|
-
# "total_posts" => <Number>,
|
29
|
-
# "total_pages" => <Number>,
|
30
|
-
# "previous_page" => <Number>,
|
31
|
-
# "next_page" => <Number> }}
|
32
|
-
def paginate(site, page)
|
33
|
-
all_posts = site.site_payload['site']['posts']
|
34
|
-
pages = Pager.calculate_pages(all_posts, site.config['paginate'].to_i)
|
35
|
-
(1..pages).each do |num_page|
|
36
|
-
pager = Pager.new(site.config, num_page, all_posts, pages)
|
37
|
-
if num_page > 1
|
38
|
-
newpage = Page.new(site, site.source, page.dir, page.name)
|
39
|
-
newpage.pager = pager
|
40
|
-
newpage.dir = File.join(page.dir, Pager.paginate_path(site.config, num_page))
|
41
|
-
site.pages << newpage
|
42
|
-
else
|
43
|
-
page.pager = pager
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
class Pager
|
52
|
-
attr_reader :page, :per_page, :posts, :total_posts, :total_pages,
|
53
|
-
:previous_page, :previous_page_path, :next_page, :next_page_path
|
54
|
-
|
55
|
-
# Calculate the number of pages.
|
56
|
-
#
|
57
|
-
# all_posts - The Array of all Posts.
|
58
|
-
# per_page - The Integer of entries per page.
|
59
|
-
#
|
60
|
-
# Returns the Integer number of pages.
|
61
|
-
def self.calculate_pages(all_posts, per_page)
|
62
|
-
(all_posts.size.to_f / per_page.to_i).ceil
|
63
|
-
end
|
64
|
-
|
65
|
-
# Determine if pagination is enabled for a given file.
|
66
|
-
#
|
67
|
-
# config - The configuration Hash.
|
68
|
-
# page - The Monad::Page with which to paginate
|
69
|
-
#
|
70
|
-
# Returns true if pagination is enabled, false otherwise.
|
71
|
-
def self.pagination_enabled?(config, page)
|
72
|
-
!config['paginate'].nil? &&
|
73
|
-
page.name == 'index.html' &&
|
74
|
-
subdirectories_identical(config['paginate_path'], page.dir)
|
75
|
-
end
|
76
|
-
|
77
|
-
# Determine if the subdirectories of the two paths are the same relative to source
|
78
|
-
#
|
79
|
-
# paginate_path - the paginate_path configuration setting
|
80
|
-
# page_dir - the directory of the Monad::Page
|
81
|
-
#
|
82
|
-
# Returns whether the subdirectories are the same relative to source
|
83
|
-
def self.subdirectories_identical(paginate_path, page_dir)
|
84
|
-
File.dirname(paginate_path).gsub(/\A\./, '') == page_dir.gsub(/\/\z/, '')
|
85
|
-
end
|
86
|
-
|
87
|
-
# Static: Return the pagination path of the page
|
88
|
-
#
|
89
|
-
# site_config - the site config
|
90
|
-
# num_page - the pagination page number
|
91
|
-
#
|
92
|
-
# Returns the pagination path as a string
|
93
|
-
def self.paginate_path(site_config, num_page)
|
94
|
-
return nil if num_page.nil? || num_page <= 1
|
95
|
-
format = File.basename(site_config['paginate_path'])
|
96
|
-
format.sub(':num', num_page.to_s)
|
97
|
-
end
|
98
|
-
|
99
|
-
# Initialize a new Pager.
|
100
|
-
#
|
101
|
-
# config - The Hash configuration of the site.
|
102
|
-
# page - The Integer page number.
|
103
|
-
# all_posts - The Array of all the site's Posts.
|
104
|
-
# num_pages - The Integer number of pages or nil if you'd like the number
|
105
|
-
# of pages calculated.
|
106
|
-
def initialize(config, page, all_posts, num_pages = nil)
|
107
|
-
@page = page
|
108
|
-
@per_page = config['paginate'].to_i
|
109
|
-
@total_pages = num_pages || Pager.calculate_pages(all_posts, @per_page)
|
110
|
-
|
111
|
-
if @page > @total_pages
|
112
|
-
raise RuntimeError, "page number can't be greater than total pages: #{@page} > #{@total_pages}"
|
113
|
-
end
|
114
|
-
|
115
|
-
init = (@page - 1) * @per_page
|
116
|
-
offset = (init + @per_page - 1) >= all_posts.size ? all_posts.size : (init + @per_page - 1)
|
117
|
-
|
118
|
-
@total_posts = all_posts.size
|
119
|
-
@posts = all_posts[init..offset]
|
120
|
-
@previous_page = @page != 1 ? @page - 1 : nil
|
121
|
-
@previous_page_path = Pager.paginate_path(config, @previous_page)
|
122
|
-
@next_page = @page != @total_pages ? @page + 1 : nil
|
123
|
-
@next_page_path = Pager.paginate_path(config, @next_page)
|
124
|
-
end
|
125
|
-
|
126
|
-
# Convert this Pager's data to a Hash suitable for use by Liquid.
|
127
|
-
#
|
128
|
-
# Returns the Hash representation of this Pager.
|
129
|
-
def to_liquid
|
130
|
-
{
|
131
|
-
'page' => page,
|
132
|
-
'per_page' => per_page,
|
133
|
-
'posts' => posts,
|
134
|
-
'total_posts' => total_posts,
|
135
|
-
'total_pages' => total_pages,
|
136
|
-
'previous_page' => previous_page,
|
137
|
-
'previous_page_path' => previous_page_path,
|
138
|
-
'next_page' => next_page,
|
139
|
-
'next_page_path' => next_page_path
|
140
|
-
}
|
141
|
-
end
|
142
|
-
end
|
143
|
-
end
|
data/lib/monad/logger.rb
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
require 'logger'
|
2
|
-
|
3
|
-
module Monad
|
4
|
-
class Logger < Logger
|
5
|
-
# Public: Print a monad message to stdout
|
6
|
-
#
|
7
|
-
# topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
|
8
|
-
# message - the message detail
|
9
|
-
#
|
10
|
-
# Returns nothing
|
11
|
-
def self.info(topic, message)
|
12
|
-
$stdout.puts message(topic, message)
|
13
|
-
end
|
14
|
-
|
15
|
-
# Public: Print a monad message to stderr
|
16
|
-
#
|
17
|
-
# topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
|
18
|
-
# message - the message detail
|
19
|
-
#
|
20
|
-
# Returns nothing
|
21
|
-
def self.warn(topic, message)
|
22
|
-
$stderr.puts message(topic, message).yellow
|
23
|
-
end
|
24
|
-
|
25
|
-
# Public: Print a monad error message to stderr
|
26
|
-
#
|
27
|
-
# topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
|
28
|
-
# message - the message detail
|
29
|
-
#
|
30
|
-
# Returns nothing
|
31
|
-
def self.error(topic, message)
|
32
|
-
$stderr.puts message(topic, message).red
|
33
|
-
end
|
34
|
-
|
35
|
-
# Public: Build a Monad topic method
|
36
|
-
#
|
37
|
-
# topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
|
38
|
-
# message - the message detail
|
39
|
-
#
|
40
|
-
# Returns the formatted message
|
41
|
-
def self.message(topic, message)
|
42
|
-
formatted_topic(topic) + message.gsub(/\s+/, ' ')
|
43
|
-
end
|
44
|
-
|
45
|
-
# Public: Format the topic
|
46
|
-
#
|
47
|
-
# topic - the topic of the message, e.g. "Configuration file", "Deprecation", etc.
|
48
|
-
#
|
49
|
-
# Returns the formatted topic statement
|
50
|
-
def self.formatted_topic(topic)
|
51
|
-
"#{topic} ".rjust(20)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
data/lib/monad/tags/gist.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
# Gist Liquid Tag
|
2
|
-
#
|
3
|
-
# Example:
|
4
|
-
# {% gist 1234567 %}
|
5
|
-
# {% gist 1234567 file.rb %}
|
6
|
-
|
7
|
-
module Monad
|
8
|
-
class GistTag < Liquid::Tag
|
9
|
-
def render(context)
|
10
|
-
if tag_contents = @markup.strip.match(/\A(\d+) ?(\S*)\Z/)
|
11
|
-
gist_id, filename = tag_contents[1].strip, tag_contents[2].strip
|
12
|
-
gist_script_tag(gist_id, filename)
|
13
|
-
else
|
14
|
-
"Error parsing gist id"
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
private
|
19
|
-
|
20
|
-
def gist_script_tag(gist_id, filename=nil)
|
21
|
-
if filename.empty?
|
22
|
-
"<script src=\"https://gist.github.com/#{gist_id}.js\"> </script>"
|
23
|
-
else
|
24
|
-
"<script src=\"https://gist.github.com/#{gist_id}.js?file=#{filename}\"> </script>"
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
Liquid::Template.register_tag('gist', Monad::GistTag)
|
data/lib/monad/tags/include.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
module Monad
|
2
|
-
module Tags
|
3
|
-
class IncludeTag < Liquid::Tag
|
4
|
-
def initialize(tag_name, file, tokens)
|
5
|
-
super
|
6
|
-
@file = file.strip
|
7
|
-
end
|
8
|
-
|
9
|
-
def render(context)
|
10
|
-
includes_dir = File.join(context.registers[:site].source, '_includes')
|
11
|
-
|
12
|
-
if File.symlink?(includes_dir)
|
13
|
-
return "Includes directory '#{includes_dir}' cannot be a symlink"
|
14
|
-
end
|
15
|
-
|
16
|
-
if @file !~ /^[a-zA-Z0-9_\/\.-]+$/ || @file =~ /\.\// || @file =~ /\/\./
|
17
|
-
return "Include file '#{@file}' contains invalid characters or sequences"
|
18
|
-
end
|
19
|
-
|
20
|
-
Dir.chdir(includes_dir) do
|
21
|
-
choices = Dir['**/*'].reject { |x| File.symlink?(x) }
|
22
|
-
if choices.include?(@file)
|
23
|
-
source = File.read(@file)
|
24
|
-
partial = Liquid::Template.parse(source)
|
25
|
-
context.stack do
|
26
|
-
partial.render(context)
|
27
|
-
end
|
28
|
-
else
|
29
|
-
"Included file '#{@file}' not found in _includes directory"
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
Liquid::Template.register_tag('include', Monad::Tags::IncludeTag)
|