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.
Files changed (182) hide show
  1. data/.gitignore +2 -0
  2. data/Gemfile +7 -0
  3. data/Guardfile +9 -0
  4. data/Rakefile +12 -1
  5. data/VERSION +1 -1
  6. data/alula.gemspec +20 -4
  7. data/lib/alula/attachment_processor.rb +77 -0
  8. data/lib/alula/cdn.rb +30 -0
  9. data/lib/alula/cdns/edgecast.rb +16 -0
  10. data/lib/alula/cdns/hosts.rb +14 -0
  11. data/lib/alula/cli.rb +90 -39
  12. data/lib/alula/compressors.rb +22 -10
  13. data/lib/alula/config.rb +141 -0
  14. data/lib/alula/content.rb +113 -0
  15. data/lib/alula/contents/attachment.rb +8 -0
  16. data/lib/alula/contents/item.rb +409 -0
  17. data/lib/alula/contents/metadata.rb +73 -0
  18. data/lib/alula/contents/page.rb +9 -0
  19. data/lib/alula/contents/post.rb +32 -0
  20. data/lib/alula/context.rb +72 -0
  21. data/lib/alula/core_ext.rb +5 -0
  22. data/lib/alula/core_ext/environment.rb +20 -0
  23. data/lib/alula/core_ext/filter.rb +20 -0
  24. data/lib/alula/core_ext/filters/smilies.rb +36 -0
  25. data/lib/alula/core_ext/manifest.rb +30 -0
  26. data/lib/alula/core_ext/tag.rb +100 -0
  27. data/lib/alula/core_ext/tags/attachment.rb +28 -0
  28. data/lib/alula/core_ext/tags/blockquote.rb +21 -0
  29. data/lib/alula/core_ext/tags/image.rb +48 -0
  30. data/lib/alula/core_ext/tags/locale.rb +17 -0
  31. data/lib/alula/core_ext/tags/video.rb +103 -0
  32. data/lib/alula/generator.rb +31 -0
  33. data/lib/alula/generators/feedbuilder.rb +44 -0
  34. data/lib/alula/generators/paginate.rb +88 -0
  35. data/lib/alula/generators/sitemap.rb +26 -0
  36. data/lib/alula/helpers.rb +2 -0
  37. data/lib/alula/helpers/addons.rb +12 -0
  38. data/lib/alula/helpers/assets.rb +56 -0
  39. data/lib/alula/helpers/url_helpers.rb +16 -0
  40. data/lib/alula/plugin.rb +32 -0
  41. data/lib/alula/processor.rb +86 -0
  42. data/lib/alula/processors/dummy.rb +24 -0
  43. data/lib/alula/processors/image.rb +52 -0
  44. data/lib/alula/processors/magick.rb +83 -0
  45. data/lib/alula/processors/video.rb +97 -0
  46. data/lib/alula/processors/zencoder.rb +199 -0
  47. data/lib/alula/progress.rb +95 -0
  48. data/lib/alula/progressbar.rb +66 -0
  49. data/lib/alula/site.rb +331 -262
  50. data/lib/alula/storage.rb +46 -0
  51. data/lib/alula/storages/file_item.rb +43 -0
  52. data/lib/alula/storages/filestorage.rb +96 -0
  53. data/lib/alula/storages/item.rb +12 -0
  54. data/lib/alula/support/commonlogger.rb +30 -0
  55. data/lib/alula/theme.rb +70 -13
  56. data/lib/alula/theme/layout.rb +56 -0
  57. data/lib/alula/theme/view.rb +43 -0
  58. data/lib/alula/version.rb +1 -1
  59. data/locales/en.yml +9 -0
  60. data/locales/fi.yml +10 -0
  61. data/locales/l10n/ar.yml +199 -0
  62. data/locales/l10n/az.yml +199 -0
  63. data/locales/l10n/bg.yml +199 -0
  64. data/locales/l10n/bn-IN.yml +182 -0
  65. data/locales/l10n/bs.yml +242 -0
  66. data/locales/l10n/ca.yml +199 -0
  67. data/locales/l10n/cs.yml +198 -0
  68. data/locales/l10n/csb.yml +210 -0
  69. data/locales/l10n/cy.yml +199 -0
  70. data/locales/l10n/da.yml +199 -0
  71. data/locales/l10n/de-AT.yml +203 -0
  72. data/locales/l10n/de-CH.yml +203 -0
  73. data/locales/l10n/de.yml +203 -0
  74. data/locales/l10n/dsb.yml +215 -0
  75. data/locales/l10n/el.yml +199 -0
  76. data/locales/l10n/en-AU.yml +205 -0
  77. data/locales/l10n/en-CA.yml +214 -0
  78. data/locales/l10n/en-GB.yml +205 -0
  79. data/locales/l10n/en-IN.yml +205 -0
  80. data/locales/l10n/en-US.yml +205 -0
  81. data/locales/l10n/en.yml +205 -0
  82. data/locales/l10n/eo.yml +201 -0
  83. data/locales/l10n/es-AR.yml +205 -0
  84. data/locales/l10n/es-CL.yml +199 -0
  85. data/locales/l10n/es-CO.yml +205 -0
  86. data/locales/l10n/es-MX.yml +205 -0
  87. data/locales/l10n/es-PE.yml +181 -0
  88. data/locales/l10n/es-VE.yml +205 -0
  89. data/locales/l10n/es.yml +199 -0
  90. data/locales/l10n/et.yml +199 -0
  91. data/locales/l10n/eu.yml +199 -0
  92. data/locales/l10n/fa.yml +199 -0
  93. data/locales/l10n/fi.yml +199 -0
  94. data/locales/l10n/fr-CA.yml +207 -0
  95. data/locales/l10n/fr-CH.yml +207 -0
  96. data/locales/l10n/fr.yml +222 -0
  97. data/locales/l10n/fur.yml +199 -0
  98. data/locales/l10n/gl-ES.yml +178 -0
  99. data/locales/l10n/gsw-CH.yml +199 -0
  100. data/locales/l10n/he.yml +201 -0
  101. data/locales/l10n/hi-IN.yml +199 -0
  102. data/locales/l10n/hi.yml +199 -0
  103. data/locales/l10n/hr.yml +237 -0
  104. data/locales/l10n/hsb.yml +214 -0
  105. data/locales/l10n/hu.yml +199 -0
  106. data/locales/l10n/id.yml +200 -0
  107. data/locales/l10n/is.yml +213 -0
  108. data/locales/l10n/it.yml +205 -0
  109. data/locales/l10n/ja.yml +197 -0
  110. data/locales/l10n/kn.yml +199 -0
  111. data/locales/l10n/ko.yml +197 -0
  112. data/locales/l10n/lo.yml +186 -0
  113. data/locales/l10n/lt.yml +182 -0
  114. data/locales/l10n/lv.yml +215 -0
  115. data/locales/l10n/mk.yml +170 -0
  116. data/locales/l10n/mn.yml +205 -0
  117. data/locales/l10n/nb.yml +207 -0
  118. data/locales/l10n/nl.yml +199 -0
  119. data/locales/l10n/nn.yml +160 -0
  120. data/locales/l10n/pl.yml +221 -0
  121. data/locales/l10n/pt-BR.yml +207 -0
  122. data/locales/l10n/pt-PT.yml +207 -0
  123. data/locales/l10n/quotes.yml +24 -0
  124. data/locales/l10n/rm.yml +182 -0
  125. data/locales/l10n/ro.yml +199 -0
  126. data/locales/l10n/ru.yml +257 -0
  127. data/locales/l10n/sk.yml +213 -0
  128. data/locales/l10n/sl.yml +210 -0
  129. data/locales/l10n/sr-Latn.yml +170 -0
  130. data/locales/l10n/sr.yml +170 -0
  131. data/locales/l10n/sv-SE.yml +199 -0
  132. data/locales/l10n/sw.yml +197 -0
  133. data/locales/l10n/th.yml +173 -0
  134. data/locales/l10n/tl.yml +229 -0
  135. data/locales/l10n/tr.yml +199 -0
  136. data/locales/l10n/uk.yml +257 -0
  137. data/locales/l10n/vi.yml +201 -0
  138. data/locales/l10n/wo.yml +205 -0
  139. data/locales/l10n/zh-CN.yml +199 -0
  140. data/locales/l10n/zh-TW.yml +199 -0
  141. data/template/Gemfile.erb +14 -4
  142. data/template/README +16 -0
  143. data/template/config.yml.erb +42 -38
  144. data/test/fixtures/config_001_simple.yml +2 -0
  145. data/test/fixtures/config_002_l10n.yml +5 -0
  146. data/test/fixtures/pages/invalid-page.markdown +1 -0
  147. data/test/fixtures/pages/multilingual-page.markdown +20 -0
  148. data/test/fixtures/pages/section/subpage.markdown +5 -0
  149. data/test/fixtures/pages/simple-page.markdown +7 -0
  150. data/test/fixtures/posts/2012-07-02-invalid-post.markdown +1 -0
  151. data/test/fixtures/posts/2012-07-02-simple.markdown +7 -0
  152. data/test/fixtures/posts/2012-07-03-full-metadata.markdown +8 -0
  153. data/test/fixtures/posts/2012-07-03-multilingual-full-metadata.markdown +20 -0
  154. data/test/fixtures/theme/test/layouts/default.html.erb +1 -0
  155. data/test/fixtures/theme/test/views/page.html.erb +1 -0
  156. data/test/fixtures/theme/test/views/post.html.erb +1 -0
  157. data/test/minitest_helper.rb +14 -0
  158. data/test/test_config.rb +33 -0
  159. data/test/test_content.rb +30 -0
  160. data/test/test_metadata.rb +83 -0
  161. data/test/test_page.rb +81 -0
  162. data/test/test_post.rb +123 -0
  163. data/test/test_storage.rb +23 -0
  164. data/test/test_storage_file.rb +32 -0
  165. data/test/test_theme.rb +45 -0
  166. data/vendor/assets/images/favicon.png +0 -0
  167. data/vendor/assets/images/grey.gif +0 -0
  168. data/vendor/assets/javascripts/jquery.alula.js.coffee +16 -0
  169. data/vendor/{javascripts → assets/javascripts}/jquery.js +0 -0
  170. data/vendor/assets/javascripts/jquery.lazyload.js +210 -0
  171. data/vendor/assets/javascripts/lazyload.js.coffee +15 -0
  172. data/vendor/layouts/feed.xml.builder +19 -0
  173. data/vendor/layouts/sitemap.xml.builder +10 -0
  174. data/vendor/views/feed_post.html.haml +1 -0
  175. metadata +529 -50
  176. data/lib/alula.rb +0 -5
  177. data/lib/alula/assethelper.rb +0 -75
  178. data/lib/alula/plugins.rb +0 -23
  179. data/lib/alula/plugins/assets.rb +0 -82
  180. data/lib/alula/plugins/pagination.rb +0 -121
  181. data/lib/alula/rake_tasks.rb +0 -42
  182. 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,17 @@
1
+ module Alula
2
+ class LocaleTag < Block
3
+ def prepare
4
+ @lang = @markup.strip
5
+ end
6
+
7
+ def render(context)
8
+ if @lang == context.locale
9
+ super
10
+ else
11
+ ''
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ Alula::Tag.register :locale, Alula::LocaleTag
@@ -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,2 @@
1
+ # require 'alula/helpers/assets'
2
+ Dir[File.join(File.dirname(__FILE__), "helpers", "*.rb")].each {|f| require f}
@@ -0,0 +1,12 @@
1
+ module Alula
2
+ module Helpers
3
+ def addons(type)
4
+ content = ""
5
+ Alula::Plugin.addons[type].each do |addon|
6
+ content += addon.respond_to?(:call) ? addon.call(self).to_s : addon
7
+ end
8
+
9
+ content
10
+ end
11
+ end
12
+ 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