monad 0.0.2 → 0.0.3
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 +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)
|