alula 0.2.3 → 0.4.0b
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.
- data/.gitignore +2 -0
- data/Gemfile +7 -0
- data/Guardfile +9 -0
- data/Rakefile +12 -1
- data/VERSION +1 -1
- data/alula.gemspec +20 -4
- data/lib/alula/attachment_processor.rb +77 -0
- data/lib/alula/cdn.rb +30 -0
- data/lib/alula/cdns/edgecast.rb +16 -0
- data/lib/alula/cdns/hosts.rb +14 -0
- data/lib/alula/cli.rb +90 -39
- data/lib/alula/compressors.rb +22 -10
- data/lib/alula/config.rb +141 -0
- data/lib/alula/content.rb +113 -0
- data/lib/alula/contents/attachment.rb +8 -0
- data/lib/alula/contents/item.rb +409 -0
- data/lib/alula/contents/metadata.rb +73 -0
- data/lib/alula/contents/page.rb +9 -0
- data/lib/alula/contents/post.rb +32 -0
- data/lib/alula/context.rb +72 -0
- data/lib/alula/core_ext.rb +5 -0
- data/lib/alula/core_ext/environment.rb +20 -0
- data/lib/alula/core_ext/filter.rb +20 -0
- data/lib/alula/core_ext/filters/smilies.rb +36 -0
- data/lib/alula/core_ext/manifest.rb +30 -0
- data/lib/alula/core_ext/tag.rb +100 -0
- data/lib/alula/core_ext/tags/attachment.rb +28 -0
- data/lib/alula/core_ext/tags/blockquote.rb +21 -0
- data/lib/alula/core_ext/tags/image.rb +48 -0
- data/lib/alula/core_ext/tags/locale.rb +17 -0
- data/lib/alula/core_ext/tags/video.rb +103 -0
- data/lib/alula/generator.rb +31 -0
- data/lib/alula/generators/feedbuilder.rb +44 -0
- data/lib/alula/generators/paginate.rb +88 -0
- data/lib/alula/generators/sitemap.rb +26 -0
- data/lib/alula/helpers.rb +2 -0
- data/lib/alula/helpers/addons.rb +12 -0
- data/lib/alula/helpers/assets.rb +56 -0
- data/lib/alula/helpers/url_helpers.rb +16 -0
- data/lib/alula/plugin.rb +32 -0
- data/lib/alula/processor.rb +86 -0
- data/lib/alula/processors/dummy.rb +24 -0
- data/lib/alula/processors/image.rb +52 -0
- data/lib/alula/processors/magick.rb +83 -0
- data/lib/alula/processors/video.rb +97 -0
- data/lib/alula/processors/zencoder.rb +199 -0
- data/lib/alula/progress.rb +95 -0
- data/lib/alula/progressbar.rb +66 -0
- data/lib/alula/site.rb +331 -262
- data/lib/alula/storage.rb +46 -0
- data/lib/alula/storages/file_item.rb +43 -0
- data/lib/alula/storages/filestorage.rb +96 -0
- data/lib/alula/storages/item.rb +12 -0
- data/lib/alula/support/commonlogger.rb +30 -0
- data/lib/alula/theme.rb +70 -13
- data/lib/alula/theme/layout.rb +56 -0
- data/lib/alula/theme/view.rb +43 -0
- data/lib/alula/version.rb +1 -1
- data/locales/en.yml +9 -0
- data/locales/fi.yml +10 -0
- data/locales/l10n/ar.yml +199 -0
- data/locales/l10n/az.yml +199 -0
- data/locales/l10n/bg.yml +199 -0
- data/locales/l10n/bn-IN.yml +182 -0
- data/locales/l10n/bs.yml +242 -0
- data/locales/l10n/ca.yml +199 -0
- data/locales/l10n/cs.yml +198 -0
- data/locales/l10n/csb.yml +210 -0
- data/locales/l10n/cy.yml +199 -0
- data/locales/l10n/da.yml +199 -0
- data/locales/l10n/de-AT.yml +203 -0
- data/locales/l10n/de-CH.yml +203 -0
- data/locales/l10n/de.yml +203 -0
- data/locales/l10n/dsb.yml +215 -0
- data/locales/l10n/el.yml +199 -0
- data/locales/l10n/en-AU.yml +205 -0
- data/locales/l10n/en-CA.yml +214 -0
- data/locales/l10n/en-GB.yml +205 -0
- data/locales/l10n/en-IN.yml +205 -0
- data/locales/l10n/en-US.yml +205 -0
- data/locales/l10n/en.yml +205 -0
- data/locales/l10n/eo.yml +201 -0
- data/locales/l10n/es-AR.yml +205 -0
- data/locales/l10n/es-CL.yml +199 -0
- data/locales/l10n/es-CO.yml +205 -0
- data/locales/l10n/es-MX.yml +205 -0
- data/locales/l10n/es-PE.yml +181 -0
- data/locales/l10n/es-VE.yml +205 -0
- data/locales/l10n/es.yml +199 -0
- data/locales/l10n/et.yml +199 -0
- data/locales/l10n/eu.yml +199 -0
- data/locales/l10n/fa.yml +199 -0
- data/locales/l10n/fi.yml +199 -0
- data/locales/l10n/fr-CA.yml +207 -0
- data/locales/l10n/fr-CH.yml +207 -0
- data/locales/l10n/fr.yml +222 -0
- data/locales/l10n/fur.yml +199 -0
- data/locales/l10n/gl-ES.yml +178 -0
- data/locales/l10n/gsw-CH.yml +199 -0
- data/locales/l10n/he.yml +201 -0
- data/locales/l10n/hi-IN.yml +199 -0
- data/locales/l10n/hi.yml +199 -0
- data/locales/l10n/hr.yml +237 -0
- data/locales/l10n/hsb.yml +214 -0
- data/locales/l10n/hu.yml +199 -0
- data/locales/l10n/id.yml +200 -0
- data/locales/l10n/is.yml +213 -0
- data/locales/l10n/it.yml +205 -0
- data/locales/l10n/ja.yml +197 -0
- data/locales/l10n/kn.yml +199 -0
- data/locales/l10n/ko.yml +197 -0
- data/locales/l10n/lo.yml +186 -0
- data/locales/l10n/lt.yml +182 -0
- data/locales/l10n/lv.yml +215 -0
- data/locales/l10n/mk.yml +170 -0
- data/locales/l10n/mn.yml +205 -0
- data/locales/l10n/nb.yml +207 -0
- data/locales/l10n/nl.yml +199 -0
- data/locales/l10n/nn.yml +160 -0
- data/locales/l10n/pl.yml +221 -0
- data/locales/l10n/pt-BR.yml +207 -0
- data/locales/l10n/pt-PT.yml +207 -0
- data/locales/l10n/quotes.yml +24 -0
- data/locales/l10n/rm.yml +182 -0
- data/locales/l10n/ro.yml +199 -0
- data/locales/l10n/ru.yml +257 -0
- data/locales/l10n/sk.yml +213 -0
- data/locales/l10n/sl.yml +210 -0
- data/locales/l10n/sr-Latn.yml +170 -0
- data/locales/l10n/sr.yml +170 -0
- data/locales/l10n/sv-SE.yml +199 -0
- data/locales/l10n/sw.yml +197 -0
- data/locales/l10n/th.yml +173 -0
- data/locales/l10n/tl.yml +229 -0
- data/locales/l10n/tr.yml +199 -0
- data/locales/l10n/uk.yml +257 -0
- data/locales/l10n/vi.yml +201 -0
- data/locales/l10n/wo.yml +205 -0
- data/locales/l10n/zh-CN.yml +199 -0
- data/locales/l10n/zh-TW.yml +199 -0
- data/template/Gemfile.erb +14 -4
- data/template/README +16 -0
- data/template/config.yml.erb +42 -38
- data/test/fixtures/config_001_simple.yml +2 -0
- data/test/fixtures/config_002_l10n.yml +5 -0
- data/test/fixtures/pages/invalid-page.markdown +1 -0
- data/test/fixtures/pages/multilingual-page.markdown +20 -0
- data/test/fixtures/pages/section/subpage.markdown +5 -0
- data/test/fixtures/pages/simple-page.markdown +7 -0
- data/test/fixtures/posts/2012-07-02-invalid-post.markdown +1 -0
- data/test/fixtures/posts/2012-07-02-simple.markdown +7 -0
- data/test/fixtures/posts/2012-07-03-full-metadata.markdown +8 -0
- data/test/fixtures/posts/2012-07-03-multilingual-full-metadata.markdown +20 -0
- data/test/fixtures/theme/test/layouts/default.html.erb +1 -0
- data/test/fixtures/theme/test/views/page.html.erb +1 -0
- data/test/fixtures/theme/test/views/post.html.erb +1 -0
- data/test/minitest_helper.rb +14 -0
- data/test/test_config.rb +33 -0
- data/test/test_content.rb +30 -0
- data/test/test_metadata.rb +83 -0
- data/test/test_page.rb +81 -0
- data/test/test_post.rb +123 -0
- data/test/test_storage.rb +23 -0
- data/test/test_storage_file.rb +32 -0
- data/test/test_theme.rb +45 -0
- data/vendor/assets/images/favicon.png +0 -0
- data/vendor/assets/images/grey.gif +0 -0
- data/vendor/assets/javascripts/jquery.alula.js.coffee +16 -0
- data/vendor/{javascripts → assets/javascripts}/jquery.js +0 -0
- data/vendor/assets/javascripts/jquery.lazyload.js +210 -0
- data/vendor/assets/javascripts/lazyload.js.coffee +15 -0
- data/vendor/layouts/feed.xml.builder +19 -0
- data/vendor/layouts/sitemap.xml.builder +10 -0
- data/vendor/views/feed_post.html.haml +1 -0
- metadata +529 -50
- data/lib/alula.rb +0 -5
- data/lib/alula/assethelper.rb +0 -75
- data/lib/alula/plugins.rb +0 -23
- data/lib/alula/plugins/assets.rb +0 -82
- data/lib/alula/plugins/pagination.rb +0 -121
- data/lib/alula/rake_tasks.rb +0 -42
- data/lib/alula/tasks.rb +0 -2
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
require 'alula/core_ext/tag'
|
|
2
|
+
require 'mini_exiftool'
|
|
3
|
+
require 'hashie/mash'
|
|
4
|
+
|
|
5
|
+
module Alula
|
|
6
|
+
class ImageTag < Tag
|
|
7
|
+
def prepare
|
|
8
|
+
@info = {}
|
|
9
|
+
|
|
10
|
+
@options["classes"] ||= []
|
|
11
|
+
@options["title"] ||= @options["alternative"]
|
|
12
|
+
@options["alternative"] ||= @options["title"]
|
|
13
|
+
@options["classes"] += [@options["align"] || "left"]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def content
|
|
17
|
+
hires = hires_url(@source, :image)
|
|
18
|
+
tag = "<a href=\"#{attachment_url(@source, :image)}\""
|
|
19
|
+
tag += " data-hires=\"#{hires}\"" if context.site.config.attachments["image"]["hires"] and hires
|
|
20
|
+
tag += ">"
|
|
21
|
+
tag += imagetag(@source, :thumbnail)
|
|
22
|
+
tag += "</a>"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def imagetag(source, type, opts = {})
|
|
26
|
+
src = attachment_url(source, type)
|
|
27
|
+
hires = hires_url(source, type)
|
|
28
|
+
|
|
29
|
+
classes = opts.delete(:classes) || @options["classes"]
|
|
30
|
+
|
|
31
|
+
tag = "<img"
|
|
32
|
+
tag += " alt=\"#{@options["alternative"]}\"" if @options["alternative"]
|
|
33
|
+
tag += " title=\"#{@options["title"]}\"" if @options["title"]
|
|
34
|
+
tag += " class=\"#{classes.join(" ")}\""
|
|
35
|
+
if context.site.config.attachments.image.lazyload
|
|
36
|
+
tag += " src=\"#{asset_url("grey.gif")}\""
|
|
37
|
+
tag += " data-original=\"#{src}\""
|
|
38
|
+
else
|
|
39
|
+
tag += " src=\"#{src}\""
|
|
40
|
+
end
|
|
41
|
+
tag += " data-hires=\"#{hires}\"" if context.site.config.attachments.image.hires and hires
|
|
42
|
+
tag += " width=\"#{info(source, type).width}\" height=\"#{info(source, type).height}\""
|
|
43
|
+
tag += " />"
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
Alula::Tag.register :image, Alula::ImageTag
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
module Alula
|
|
2
|
+
class VideoTag < Tag
|
|
3
|
+
def prepare
|
|
4
|
+
@info = {}
|
|
5
|
+
|
|
6
|
+
@options["classes"] ||= []
|
|
7
|
+
@options["title"] ||= @options["alternative"]
|
|
8
|
+
@options["alternative"] ||= @options["title"]
|
|
9
|
+
@options["classes"] += [@options["align"] || "left"]
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def content
|
|
13
|
+
video_tag(@source)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def video_tag(source)
|
|
17
|
+
poster = source.gsub(/#{File.extname(source)}$/, '.png')
|
|
18
|
+
info = info(poster, :thumbnail)
|
|
19
|
+
poster = attachment_url(poster, :thumbnail)
|
|
20
|
+
|
|
21
|
+
tag = "<video"
|
|
22
|
+
tag += " controls"
|
|
23
|
+
tag += " class=\"#{(@options["classes"]).join(" ")}\""
|
|
24
|
+
tag += " width=\"#{info.width}\""
|
|
25
|
+
tag += " height=\"#{info.height}\""
|
|
26
|
+
tag += " poster=\"#{poster}\""
|
|
27
|
+
tag += " preload=\"none\">"
|
|
28
|
+
|
|
29
|
+
sources.each do |source|
|
|
30
|
+
tag += " <source src=\"#{source[:url]}\" #{source[:hires] ? "data-quality=\"hd\"" : ""} />"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
tag += "</video>"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
def sources
|
|
39
|
+
@sources ||= begin
|
|
40
|
+
variants.collect {|variant|
|
|
41
|
+
name = @source.gsub(/#{File.extname(@source)}$/, variant[:ext])
|
|
42
|
+
{
|
|
43
|
+
name: name,
|
|
44
|
+
path: attachment_path(name, "video"),
|
|
45
|
+
url: attachment_url(name, "video"),
|
|
46
|
+
hires: variant[:hires],
|
|
47
|
+
mobile: variant[:mobile]
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def variants
|
|
54
|
+
@variants ||= begin
|
|
55
|
+
# Collect all formats
|
|
56
|
+
variants = Hash[
|
|
57
|
+
self.context.site.config.attachments.video.formats.collect { |format|
|
|
58
|
+
[format, {
|
|
59
|
+
format: format,
|
|
60
|
+
mobile: false,
|
|
61
|
+
hires: false }]
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
# Generate mobile variants?
|
|
65
|
+
if self.context.site.config.attachments.video.mobile
|
|
66
|
+
variants.merge!(Hash[ variants.collect {|name, fmt| ["#{name}-mobile", fmt.merge({
|
|
67
|
+
mobile: true,
|
|
68
|
+
})] } ])
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Generate HD versions
|
|
72
|
+
if self.context.site.config.attachments.video.hires
|
|
73
|
+
variants.merge!(Hash[ variants.collect {|name, fmt| ["#{name}-hires", fmt.merge({
|
|
74
|
+
hires: true,
|
|
75
|
+
})] } ])
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
# Sort by preferred order
|
|
80
|
+
formats = self.context.site.config.attachments.video.formats
|
|
81
|
+
variants.sort {|a, b|
|
|
82
|
+
# Sort by preferred format order
|
|
83
|
+
c = formats.index(a.last[:format]) <=> formats.index(b.last[:format])
|
|
84
|
+
|
|
85
|
+
# Sort HD videos on top
|
|
86
|
+
c == 0 and c = (a.last[:hires] == b.last[:hires]) ? 0 : (a.last[:hires] ? -1 : 1)
|
|
87
|
+
|
|
88
|
+
# Put mobile low
|
|
89
|
+
c == 0 and c = (a.last[:mobile] == b.last[:mobile]) ? 0 : (a.last[:mobile] ? 1 : -1)
|
|
90
|
+
|
|
91
|
+
c
|
|
92
|
+
}.collect{|name, format|
|
|
93
|
+
ext = (format[:mobile] ? "-mobile" : "") + (format[:hires] ? "-hires" : "") + ".#{format[:format]}"
|
|
94
|
+
|
|
95
|
+
{ext: ext, mobile: format[:mobile], hires: format[:hires]}
|
|
96
|
+
}
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
Alula::Tag.register :video, Alula::VideoTag
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Alula
|
|
2
|
+
class Generator
|
|
3
|
+
autoload :Paginate, 'alula/generators/paginate'
|
|
4
|
+
autoload :FeedBuilder, 'alula/generators/feedbuilder'
|
|
5
|
+
autoload :Sitemap, 'alula/generators/sitemap'
|
|
6
|
+
|
|
7
|
+
attr_reader :options
|
|
8
|
+
attr_reader :site
|
|
9
|
+
|
|
10
|
+
def self.load(opts)
|
|
11
|
+
type = opts.delete(:type)
|
|
12
|
+
options = opts.delete(:options)
|
|
13
|
+
|
|
14
|
+
# Try to find our generator
|
|
15
|
+
cls_name = self.constants.select {|t| t.to_s.downcase == type.downcase}.first
|
|
16
|
+
if cls_name
|
|
17
|
+
cls = self.const_get(cls_name)
|
|
18
|
+
gen = cls.new(options, opts)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def initialize(options, opts)
|
|
23
|
+
@options = options
|
|
24
|
+
@site = opts.delete(:site)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def substitutes(locale, item)
|
|
28
|
+
{}
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
require 'builder' # As suggested by tilt
|
|
2
|
+
|
|
3
|
+
module Alula
|
|
4
|
+
class Generator::FeedBuilder < Generator
|
|
5
|
+
def generate
|
|
6
|
+
# Loop all languages and count posts per language
|
|
7
|
+
@languages = {}
|
|
8
|
+
self.site.content.posts.each do |post|
|
|
9
|
+
post.languages.each do |lang|
|
|
10
|
+
@languages[lang] ||= []
|
|
11
|
+
@languages[lang] << post
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
titles = Hash[@languages.collect {|lang, x| [lang, I18n.t("feedbuilder.recent_posts", locale: lang)]}]
|
|
15
|
+
posts = Hash[
|
|
16
|
+
@languages.collect do |lang, posts|
|
|
17
|
+
[ lang, posts.slice(0, self.options.items) ]
|
|
18
|
+
end
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
@feed_page = Alula::Content::Page.new({
|
|
22
|
+
generator: self,
|
|
23
|
+
posts: posts,
|
|
24
|
+
title: titles,
|
|
25
|
+
name: "feed.xml",
|
|
26
|
+
slug: "feed",
|
|
27
|
+
template: self.options.template || "/:locale/:name",
|
|
28
|
+
site: self.site,
|
|
29
|
+
layout: "feed",
|
|
30
|
+
},
|
|
31
|
+
:previous => ->(locale) { nil },
|
|
32
|
+
:next => ->(locale) { nil },
|
|
33
|
+
:navigation => ->(locale) { nil },
|
|
34
|
+
)
|
|
35
|
+
self.site.content.pages << @feed_page
|
|
36
|
+
|
|
37
|
+
# Add link to head
|
|
38
|
+
Alula::Plugin.addon(:head, ->(context) {
|
|
39
|
+
"<link rel=\"alternate\" type=\"application/rss+xml\" title=\"RSS\" href=\"#{context.url_for(@feed_page.url(context.locale))}\">"
|
|
40
|
+
})
|
|
41
|
+
# -# %link{rel: "alternate", type: "application/rss+xml", title: "RSS", href: "/feed.xml"}
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
module Alula
|
|
2
|
+
class Generator::Paginate < Generator
|
|
3
|
+
def generate
|
|
4
|
+
# Loop all languages and count posts per language
|
|
5
|
+
@languages = {}
|
|
6
|
+
self.site.content.posts.each do |post|
|
|
7
|
+
post.languages.each do |lang|
|
|
8
|
+
@languages[lang] ||= []
|
|
9
|
+
@languages[lang] << post
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Maximum amount of posts
|
|
14
|
+
num_posts = self.site.content.posts.count
|
|
15
|
+
# Maximum number of required pages
|
|
16
|
+
pages = (num_posts / self.options.items).ceil
|
|
17
|
+
|
|
18
|
+
(0..pages).each do |page|
|
|
19
|
+
languages = @languages.select { |lang, posts| posts.count > page * self.options.items }
|
|
20
|
+
posts = Hash[
|
|
21
|
+
languages.collect do |lang, posts|
|
|
22
|
+
[ lang, posts.slice(page * self.options.items, self.options.items) ]
|
|
23
|
+
end
|
|
24
|
+
]
|
|
25
|
+
titles = Hash[
|
|
26
|
+
languages.collect {|lang, x| [lang, I18n.t("paginate.title", locale: lang, page: (page + 1))]}
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
self.site.content.pages << Alula::Content::Page.new({
|
|
30
|
+
generator: self,
|
|
31
|
+
posts: posts,
|
|
32
|
+
pagenum: (page + 1),
|
|
33
|
+
pages: (pages + 1),
|
|
34
|
+
title: titles,
|
|
35
|
+
name: "page-#{(page + 1)}",
|
|
36
|
+
slug: "page-#{(page + 1)}",
|
|
37
|
+
template: self.options.template,
|
|
38
|
+
site: self.site,
|
|
39
|
+
view: self.options.view || "paginate",
|
|
40
|
+
},
|
|
41
|
+
:previous => ->(locale) {
|
|
42
|
+
pos = self.navigation(locale).index(self)
|
|
43
|
+
if pos and pos < (self.navigation(locale).count - 1)
|
|
44
|
+
self.navigation(locale)[pos + 1]
|
|
45
|
+
else
|
|
46
|
+
nil
|
|
47
|
+
end
|
|
48
|
+
},
|
|
49
|
+
:next => ->(locale) {
|
|
50
|
+
pos = self.navigation(locale).index(self)
|
|
51
|
+
if pos and pos > 0
|
|
52
|
+
self.navigation(locale)[pos - 1]
|
|
53
|
+
else
|
|
54
|
+
nil
|
|
55
|
+
end
|
|
56
|
+
},
|
|
57
|
+
:navigation => ->(locale) {
|
|
58
|
+
locale ||= self.current_locale || self.site.config.locale
|
|
59
|
+
@navigation[locale] ||= self.site.content.pages.select { |item| item.metadata.generator == self.generator and item.languages.include?(locale) }
|
|
60
|
+
}
|
|
61
|
+
)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def substitutes(locale, item)
|
|
66
|
+
{
|
|
67
|
+
"page" => item.metadata.pagenum.to_s,
|
|
68
|
+
}
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# def generate_content
|
|
72
|
+
# # Generate pagination and pages
|
|
73
|
+
# num_posts = @site.content.posts.count
|
|
74
|
+
# pages = (num_posts / options.items).ceil
|
|
75
|
+
#
|
|
76
|
+
# (0..pages).each do |pagenum|
|
|
77
|
+
# pagename = "page#{pagenum}"
|
|
78
|
+
#
|
|
79
|
+
# @site.generated << Alula::Content::Page.new({
|
|
80
|
+
# site: @site,
|
|
81
|
+
# posts: @site.content.posts.slice(options.items * pagenum, options.items),
|
|
82
|
+
# current_page: (pagenum + 1),
|
|
83
|
+
# name: pagename,
|
|
84
|
+
# })
|
|
85
|
+
# end
|
|
86
|
+
# end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'builder' # For Tilt
|
|
2
|
+
|
|
3
|
+
module Alula
|
|
4
|
+
class Generator::Sitemap < Generator
|
|
5
|
+
def generate
|
|
6
|
+
self.site.content.pages << Alula::Content::Page.new({
|
|
7
|
+
generator: self,
|
|
8
|
+
urls: ->(context) {
|
|
9
|
+
(context.site.content.posts + context.site.content.pages).collect { |content|
|
|
10
|
+
content.languages.collect{|lang| {
|
|
11
|
+
url: content.url(lang),
|
|
12
|
+
lastmod: content.last_modified,
|
|
13
|
+
priority: content.generator.nil? ? 0.5 : 0.3,
|
|
14
|
+
}
|
|
15
|
+
}}.flatten
|
|
16
|
+
},
|
|
17
|
+
title: "Sitemap",
|
|
18
|
+
name: "sitemap.xml",
|
|
19
|
+
slug: "sitemap",
|
|
20
|
+
template: self.options.template || "/:locale/:name",
|
|
21
|
+
site: self.site,
|
|
22
|
+
layout: "sitemap",
|
|
23
|
+
})
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
module Alula
|
|
2
|
+
module Helpers
|
|
3
|
+
def stylesheet_link(name = "style", opts = {})
|
|
4
|
+
name += ".css" if File.extname(name).empty?
|
|
5
|
+
options = opts.collect{|name,value| !!value == value ? (value ? "#{name}" : "") : "#{name}=\"#{value}\"" }.join(" ")
|
|
6
|
+
|
|
7
|
+
if asset_url(name)
|
|
8
|
+
# Inline?
|
|
9
|
+
if self.environment[name].pathname.size > 10
|
|
10
|
+
"<link rel=\"stylesheet\" href=\"#{asset_url(name)}\" type=\"text/css\" #{options}/>"
|
|
11
|
+
else
|
|
12
|
+
content = self.environment[name].pathname.read
|
|
13
|
+
"<style type=\"text/css\" #{options}>#{content}</style>"
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def javascript_link(name = "script", opts = {})
|
|
19
|
+
name += ".js" if File.extname(name).empty?
|
|
20
|
+
case Alula::Plugin.script_load_mode
|
|
21
|
+
when :async
|
|
22
|
+
opts[:async] = true
|
|
23
|
+
when :defer
|
|
24
|
+
opts[:defer] = true
|
|
25
|
+
end
|
|
26
|
+
options = opts.collect{|name,value| !!value == value ? (value ? "#{name}" : "") : "#{name}=\"#{value}\"" }.join(" ")
|
|
27
|
+
|
|
28
|
+
if asset_url(name)
|
|
29
|
+
# Inline?
|
|
30
|
+
if self.environment[name].pathname.size > 10
|
|
31
|
+
"<script #{options} src=\"#{asset_url(name)}\"></script>"
|
|
32
|
+
else
|
|
33
|
+
content = self.environment[name].pathname.read
|
|
34
|
+
"<script #{options}>#{content}</script>"
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def asset_path(name)
|
|
40
|
+
return if name.nil?
|
|
41
|
+
|
|
42
|
+
if self.environment[name]
|
|
43
|
+
# Get asset URL
|
|
44
|
+
asset_path = File.join("assets", self.environment[name].digest_path)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def asset_url(name)
|
|
49
|
+
return if name.nil?
|
|
50
|
+
|
|
51
|
+
if self.environment[name]
|
|
52
|
+
self.site.cdn.url_for(asset_path(name), file: self.environment[name].pathname.to_s)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Alula
|
|
2
|
+
module Helpers
|
|
3
|
+
def url_for(name)
|
|
4
|
+
File.join(self.site.config.url, name)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def link_to(content, url, attributes = {})
|
|
8
|
+
tag = "<a"
|
|
9
|
+
tag += " href=\"#{url}\""
|
|
10
|
+
attributes.each do |name, value|
|
|
11
|
+
tag += " #{name}=\"#{value}\""
|
|
12
|
+
end
|
|
13
|
+
tag += ">#{content}</a>"
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|