ruhoh 1.1 → 2.1

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 (121) hide show
  1. data/Gemfile +3 -3
  2. data/README.md +3 -2
  3. data/Rakefile +1 -22
  4. data/bin/ruhoh +1 -5
  5. data/history.json +16 -0
  6. data/lib/ruhoh.rb +229 -84
  7. data/lib/ruhoh/base/collection.rb +280 -0
  8. data/lib/ruhoh/base/compiler.rb +55 -0
  9. data/lib/ruhoh/base/model.rb +220 -0
  10. data/lib/ruhoh/base/model_view.rb +152 -0
  11. data/lib/ruhoh/base/watcher.rb +25 -0
  12. data/lib/ruhoh/cache.rb +46 -0
  13. data/lib/ruhoh/client.rb +162 -0
  14. data/lib/ruhoh/collections.rb +172 -0
  15. data/lib/ruhoh/console_methods.rb +21 -0
  16. data/lib/ruhoh/{converters/converter.rb → converter.rb} +4 -1
  17. data/lib/ruhoh/programs/compile.rb +22 -0
  18. data/lib/ruhoh/programs/preview.rb +63 -0
  19. data/lib/ruhoh/programs/watch.rb +45 -0
  20. data/lib/ruhoh/resources/dash/collection.rb +10 -0
  21. data/lib/ruhoh/resources/dash/model.rb +5 -0
  22. data/lib/ruhoh/resources/dash/model_view.rb +5 -0
  23. data/lib/ruhoh/resources/dash/previewer.rb +13 -0
  24. data/lib/ruhoh/resources/data/collection.rb +9 -0
  25. data/lib/ruhoh/resources/data/collection_view.rb +23 -0
  26. data/lib/ruhoh/resources/javascripts/collection.rb +9 -0
  27. data/lib/ruhoh/resources/javascripts/collection_view.rb +46 -0
  28. data/lib/ruhoh/resources/javascripts/compiler.rb +5 -0
  29. data/lib/ruhoh/resources/layouts/client.rb +45 -0
  30. data/lib/ruhoh/resources/layouts/model.rb +16 -0
  31. data/lib/ruhoh/resources/media/collection.rb +9 -0
  32. data/lib/ruhoh/resources/media/compiler.rb +27 -0
  33. data/lib/ruhoh/resources/pages/client.rb +124 -0
  34. data/lib/ruhoh/resources/pages/collection.rb +86 -0
  35. data/lib/ruhoh/resources/pages/collection_view.rb +73 -0
  36. data/lib/ruhoh/resources/pages/compiler.rb +101 -0
  37. data/lib/ruhoh/resources/pages/model.rb +5 -0
  38. data/lib/ruhoh/resources/pages/model_view.rb +5 -0
  39. data/lib/ruhoh/resources/pages/previewer.rb +72 -0
  40. data/lib/ruhoh/resources/partials/model.rb +11 -0
  41. data/lib/ruhoh/resources/stylesheets/collection.rb +9 -0
  42. data/lib/ruhoh/resources/stylesheets/collection_view.rb +45 -0
  43. data/lib/ruhoh/resources/stylesheets/compiler.rb +5 -0
  44. data/lib/ruhoh/resources/theme/collection.rb +14 -0
  45. data/lib/ruhoh/resources/theme/compiler.rb +54 -0
  46. data/lib/ruhoh/resources/widgets/collection.rb +26 -0
  47. data/lib/ruhoh/resources/widgets/collection_view.rb +34 -0
  48. data/lib/ruhoh/resources/widgets/compiler.rb +27 -0
  49. data/lib/ruhoh/resources/widgets/model.rb +16 -0
  50. data/lib/ruhoh/routes.rb +29 -0
  51. data/lib/ruhoh/utils.rb +32 -49
  52. data/lib/ruhoh/version.rb +2 -2
  53. data/lib/ruhoh/views/helpers/categories.rb +38 -0
  54. data/lib/ruhoh/views/helpers/paginator.rb +39 -0
  55. data/lib/ruhoh/views/helpers/tags.rb +37 -0
  56. data/lib/ruhoh/views/master_view.rb +183 -0
  57. data/lib/ruhoh/views/rmustache.rb +24 -0
  58. data/ruhoh.gemspec +6 -82
  59. data/spec/spec_helper.rb +1 -1
  60. data/spec/support/shared_contexts.rb +6 -5
  61. data/system/{scaffolds/post.html → _scaffold.html} +1 -1
  62. data/system/{dash.html → dash/index.html} +37 -51
  63. data/system/{scaffolds/layout.html → layouts/_scaffold.html} +0 -0
  64. data/system/layouts/paginator.html +28 -0
  65. data/system/plugins/sprockets/javascripts/compiler.rb +25 -0
  66. data/system/plugins/sprockets/javascripts/previewer.rb +17 -0
  67. data/system/plugins/sprockets/stylesheets/compiler.rb +26 -0
  68. data/system/plugins/sprockets/stylesheets/previewer.rb +17 -0
  69. data/system/widgets/analytics/{layouts/getclicky.html → getclicky.html} +6 -2
  70. data/system/widgets/analytics/{layouts/google.html → google.html} +5 -1
  71. data/system/widgets/comments/{layouts/disqus.html → disqus.html} +6 -2
  72. data/system/widgets/comments/{layouts/facebook.html → facebook.html} +9 -2
  73. data/system/widgets/comments/{layouts/intensedebate.html → intensedebate.html} +5 -1
  74. data/system/widgets/comments/{layouts/livefyre.html → livefyre.html} +5 -1
  75. data/system/widgets/google_prettify/{layouts/google_prettify.html → default.html} +6 -2
  76. metadata +69 -66
  77. data/lib/ruhoh/client/client.rb +0 -306
  78. data/lib/ruhoh/client/console_methods.rb +0 -9
  79. data/lib/ruhoh/client/help.yml +0 -56
  80. data/lib/ruhoh/compiler.rb +0 -72
  81. data/lib/ruhoh/compilers/rss.rb +0 -39
  82. data/lib/ruhoh/compilers/theme.rb +0 -46
  83. data/lib/ruhoh/config.rb +0 -62
  84. data/lib/ruhoh/db.rb +0 -50
  85. data/lib/ruhoh/deployers/s3.rb +0 -71
  86. data/lib/ruhoh/page.rb +0 -106
  87. data/lib/ruhoh/parsers/javascripts.rb +0 -55
  88. data/lib/ruhoh/parsers/layouts.rb +0 -32
  89. data/lib/ruhoh/parsers/pages.rb +0 -79
  90. data/lib/ruhoh/parsers/partials.rb +0 -42
  91. data/lib/ruhoh/parsers/payload.rb +0 -49
  92. data/lib/ruhoh/parsers/posts.rb +0 -259
  93. data/lib/ruhoh/parsers/routes.rb +0 -20
  94. data/lib/ruhoh/parsers/scaffolds.rb +0 -35
  95. data/lib/ruhoh/parsers/site.rb +0 -19
  96. data/lib/ruhoh/parsers/stylesheets.rb +0 -63
  97. data/lib/ruhoh/parsers/theme_config.rb +0 -30
  98. data/lib/ruhoh/parsers/widgets.rb +0 -104
  99. data/lib/ruhoh/paths.rb +0 -83
  100. data/lib/ruhoh/previewer.rb +0 -48
  101. data/lib/ruhoh/program.rb +0 -68
  102. data/lib/ruhoh/templaters/asset_helpers.rb +0 -66
  103. data/lib/ruhoh/templaters/base_helpers.rb +0 -147
  104. data/lib/ruhoh/templaters/helpers.rb +0 -8
  105. data/lib/ruhoh/templaters/rmustache.rb +0 -70
  106. data/lib/ruhoh/urls.rb +0 -50
  107. data/lib/ruhoh/watch.rb +0 -78
  108. data/spec/config_spec.rb +0 -50
  109. data/spec/db_spec.rb +0 -91
  110. data/spec/page_spec.rb +0 -164
  111. data/spec/parsers/layouts_spec.rb +0 -41
  112. data/spec/parsers/pages_spec.rb +0 -120
  113. data/spec/parsers/posts_spec.rb +0 -309
  114. data/spec/parsers/routes_spec.rb +0 -39
  115. data/spec/parsers/site_spec.rb +0 -28
  116. data/spec/setup_spec.rb +0 -12
  117. data/system/scaffolds/draft.html +0 -9
  118. data/system/scaffolds/page.html +0 -4
  119. data/system/widgets/analytics/config.yml +0 -5
  120. data/system/widgets/comments/config.yml +0 -13
  121. data/system/widgets/google_prettify/config.yml +0 -1
@@ -1,55 +0,0 @@
1
- class Ruhoh
2
- module Parsers
3
- # Collect all the javascripts.
4
- # Themes explicitly define which javascripts to load via theme.yml.
5
- # Additionally, widgets may register javascript dependencies, which are resolved here.
6
- module Javascripts
7
-
8
- # Generates mappings to all registered javascripts.
9
- # Returns Hash with layout names as keys and Array of asset Objects as values
10
- def self.generate
11
- assets = self.theme_javascripts
12
- assets[Ruhoh.names.widgets] = self.widget_javascripts
13
- assets
14
- end
15
-
16
- def self.theme_javascripts
17
- return {} unless Ruhoh::DB.theme_config[Ruhoh.names.javascripts].is_a? Hash
18
- assets = {}
19
- Ruhoh::DB.theme_config[Ruhoh.names.javascripts].each do |key, value|
20
- next if key == Ruhoh.names.widgets # Widgets are handled separately.
21
- assets[key] = Array(value).map { |v|
22
- url = (v =~ /^(http:|https:)?\/\//i) ? v : "#{Ruhoh.urls.theme_javascripts}/#{v}"
23
- {
24
- "url" => url,
25
- "id" => File.join(Ruhoh.paths.theme_javascripts, v)
26
- }
27
- }
28
- end
29
-
30
- assets
31
- end
32
-
33
- # Notes:
34
- # The automatic script inclusion is currently handled within the widget parser.
35
- # This differs from the auto-stylesheet inclusion relative to themes,
36
- # which is handled in the stylesheet parser.
37
- # Make sure there are some standards with this.
38
- def self.widget_javascripts
39
- assets = []
40
- Ruhoh::DB.widgets.each_value do |widget|
41
- next unless widget[Ruhoh.names.javascripts]
42
- assets += Array(widget[Ruhoh.names.javascripts]).map {|path|
43
- {
44
- "url" => [Ruhoh.urls.widgets, widget['name'], Ruhoh.names.javascripts, path].join('/'),
45
- "id" => File.join(Ruhoh.paths.widgets, widget['name'], Ruhoh.names.javascripts, path)
46
- }
47
- }
48
- end
49
-
50
- assets
51
- end
52
-
53
- end #Javascripts
54
- end #Parsers
55
- end #Ruhoh
@@ -1,32 +0,0 @@
1
- class Ruhoh
2
- module Parsers
3
- module Layouts
4
-
5
- # Generate layouts only from the active theme.
6
- def self.generate
7
- layouts = {}
8
- self.files.each do |filename|
9
- id = File.basename(filename, File.extname(filename))
10
- data = Ruhoh::Utils.parse_layout_file(Ruhoh.paths.theme_layouts, filename)
11
- data['id'] = id
12
- layouts[id] = data
13
- end
14
-
15
- Ruhoh::Utils.report('Layouts', layouts, [])
16
- layouts
17
- end
18
-
19
- def self.files
20
- return [] unless FileTest.directory?(Ruhoh.paths.theme_layouts)
21
- FileUtils.cd(Ruhoh.paths.theme_layouts) {
22
- return Dir["**/*.*"].select { |filename|
23
- next if FileTest.directory?(filename)
24
- next if ['_','.'].include? filename[0]
25
- true
26
- }
27
- }
28
- end
29
-
30
- end #Layouts
31
- end #Parsers
32
- end #Ruhoh
@@ -1,79 +0,0 @@
1
- class Ruhoh
2
- module Parsers
3
- module Pages
4
-
5
- # Public: Generate the Pages dictionary.
6
- #
7
- def self.generate
8
- Ruhoh.ensure_setup
9
-
10
- pages = self.files
11
- dictionary = {}
12
-
13
- pages.each do |filename|
14
- id = self.make_id(filename)
15
- parsed_page = ''
16
- FileUtils.cd(Ruhoh.paths.base) { parsed_page = Ruhoh::Utils.parse_page_file(filename) }
17
-
18
- parsed_page['data']['id'] = id
19
- parsed_page['data']['url'] = self.permalink(parsed_page['data'])
20
- parsed_page['data']['title'] = parsed_page['data']['title'] || self.to_title(filename)
21
- if parsed_page['data']['layout'].nil?
22
- parsed_page['data']['layout'] = Ruhoh.config.pages_layout
23
- end
24
-
25
- dictionary[id] = parsed_page['data']
26
- end
27
-
28
- Ruhoh::Utils.report('Pages', dictionary, [])
29
- dictionary
30
- end
31
-
32
- def self.files
33
- FileUtils.cd(Ruhoh.paths.base) {
34
- return Dir["#{Ruhoh.names.pages}/**/*.*"].select { |filename|
35
- next unless self.is_valid_page?(filename)
36
- true
37
- }
38
- }
39
- end
40
-
41
- def self.is_valid_page?(filepath)
42
- return false if FileTest.directory?(filepath)
43
- return false if ['.'].include? filepath[0]
44
- Ruhoh.config.pages_exclude.each {|regex| return false if filepath =~ regex }
45
- true
46
- end
47
-
48
- def self.make_id(filename)
49
- filename.gsub(Regexp.new("^#{Ruhoh.names.pages}/"), '')
50
- end
51
-
52
- def self.to_title(filename)
53
- name = File.basename( filename, File.extname(filename) )
54
- name = filename.split('/')[-2] if name == 'index' && !filename.index('/').nil?
55
- name.gsub(/[^\p{Word}+]/u, ' ').gsub(/\b\w/){$&.upcase}
56
- end
57
-
58
- # Build the permalink for the given page.
59
- # Only recognize extensions registered from a 'convertable' module.
60
- # This means 'non-convertable' extensions should pass-through.
61
- #
62
- # Returns [String] the permalink for this page.
63
- def self.permalink(page)
64
- ext = File.extname(page['id'])
65
- name = page['id'].gsub(Regexp.new("#{ext}$"), '')
66
- ext = '.html' if Ruhoh::Converter.extensions.include?(ext)
67
- url = name.split('/').map {|p| Ruhoh::Urls.to_url_slug(p) }.join('/')
68
- url = "#{url}#{ext}".gsub(/index.html$/, '')
69
- if page['permalink'] == 'pretty' || Ruhoh.config.pages_permalink == 'pretty'
70
- url = url.gsub(/\.html$/, '')
71
- end
72
-
73
- url = '/' if url.empty?
74
- Ruhoh::Urls.to_url(url)
75
- end
76
-
77
- end # Pages
78
- end #Parsers
79
- end #Ruhoh
@@ -1,42 +0,0 @@
1
- class Ruhoh
2
- module Parsers
3
- module Partials
4
-
5
- def self.generate
6
- self.system_partials.merge(
7
- self.global_partials
8
- ).merge(
9
- self.theme_partials
10
- )
11
- end
12
-
13
- def self.theme_partials
14
- self.process(Ruhoh.paths.theme_partials)
15
- end
16
-
17
- def self.global_partials
18
- self.process(Ruhoh.paths.partials)
19
- end
20
-
21
- def self.system_partials
22
- self.process(Ruhoh.paths.system_partials)
23
- end
24
-
25
- def self.process(path)
26
- return {} unless File.exist?(path)
27
-
28
- partials = {}
29
- FileUtils.cd(path) {
30
- Dir.glob("**/*").each { |filename|
31
- next if FileTest.directory?(filename)
32
- next if ['.'].include? filename[0]
33
- name = filename.chomp(File.extname(filename))
34
- File.open(filename, 'r:UTF-8') { |f| partials[name] = f.read }
35
- }
36
- }
37
- partials
38
- end
39
-
40
- end #Partials
41
- end #Parsers
42
- end #Ruhoh
@@ -1,49 +0,0 @@
1
- class Ruhoh
2
- module Parsers
3
- module Payload
4
-
5
- def self.generate
6
- {
7
- "db" => {
8
- "pages" => Ruhoh::DB.pages,
9
- "posts" => self.determine_category_and_tag_urls,
10
- },
11
- "site" => Ruhoh::DB.site,
12
- 'page' => {},
13
- "urls" => {
14
- "theme" => Ruhoh.urls.theme,
15
- "theme_stylesheets" => Ruhoh.urls.theme_stylesheets,
16
- "theme_javascripts" => Ruhoh.urls.theme_javascripts,
17
- "theme_media" => Ruhoh.urls.theme_media,
18
- "media" => Ruhoh.urls.media,
19
- "base_path" => Ruhoh.config.base_path,
20
- }
21
- }
22
- end
23
-
24
- # This is an ugly hack to determine the proper category and tag urls.
25
- # TODO: Refactor this out.
26
- def self.determine_category_and_tag_urls
27
- return nil unless Ruhoh::DB.routes && Ruhoh::DB.posts
28
- categories_url = nil
29
- [Ruhoh::Urls.to_url("categories"), Ruhoh::Urls.to_url("categories.html")].each { |url|
30
- categories_url = url and break if Ruhoh::DB.routes.key?(url)
31
- }
32
- Ruhoh::DB.posts['categories'].each do |key, value|
33
- Ruhoh::DB.posts['categories'][key]['url'] = "#{categories_url}##{value['name']}-ref"
34
- end
35
-
36
- tags_url = nil
37
- [Ruhoh::Urls.to_url("tags"), Ruhoh::Urls.to_url("tags.html")].each { |url|
38
- tags_url = url and break if Ruhoh::DB.routes.key?(url)
39
- }
40
- Ruhoh::DB.posts['tags'].each do |key, value|
41
- Ruhoh::DB.posts['tags'][key]['url'] = "#{tags_url}##{value['name']}-ref"
42
- end
43
-
44
- Ruhoh::DB.posts
45
- end
46
-
47
- end #Payload
48
- end #Parsers
49
- end #Ruhoh
@@ -1,259 +0,0 @@
1
- class Ruhoh
2
- module Parsers
3
- module Posts
4
-
5
- DateMatcher = /^(.+\/)*(\d+-\d+-\d+)-(.*)(\.[^.]+)$/
6
- Matcher = /^(.+\/)*(.*)(\.[^.]+)$/
7
-
8
- # Public: Generate the Posts dictionary.
9
- #
10
- def self.generate
11
- Ruhoh.ensure_setup
12
-
13
- results = self.process
14
- ordered_posts = self.ordered_posts(results['posts'])
15
-
16
- {
17
- 'dictionary' => results['posts'],
18
- 'drafts' => results['drafts'],
19
- 'chronological' => self.build_chronology(ordered_posts),
20
- 'collated' => self.collate(ordered_posts),
21
- 'tags' => self.parse_tags(ordered_posts),
22
- 'categories' => self.parse_categories(ordered_posts)
23
- }
24
- end
25
-
26
- def self.process
27
- dictionary = {}
28
- drafts = []
29
- invalid = []
30
-
31
- self.files.each do |filename|
32
- parsed_page = ''
33
- FileUtils.cd(Ruhoh.paths.base) { parsed_page = Ruhoh::Utils.parse_page_file(filename) }
34
- data = parsed_page['data']
35
-
36
- filename_data = self.parse_page_filename(filename)
37
- if filename_data.empty?
38
- error = "Invalid Filename Format. Format should be: my-post-title.ext"
39
- invalid << [filename, error] ; next
40
- end
41
-
42
- data['date'] ||= filename_data['date']
43
-
44
- unless self.formatted_date(data['date'])
45
- error = "Invalid Date Format. Date should be: YYYY-MM-DD"
46
- invalid << [filename, error] ; next
47
- end
48
-
49
- if data['type'] == 'draft'
50
- next if Ruhoh.config.env == 'production'
51
- drafts << filename
52
- end
53
-
54
- data['date'] = data['date'].to_s
55
- data['id'] = filename
56
- data['title'] = data['title'] || filename_data['title']
57
- data['url'] = self.permalink(data)
58
- data['layout'] = Ruhoh.config.posts_layout if data['layout'].nil?
59
- dictionary[filename] = data
60
- end
61
-
62
- Ruhoh::Utils.report('Posts', dictionary, invalid)
63
-
64
- {
65
- "posts" => dictionary,
66
- "drafts" => drafts
67
- }
68
- end
69
-
70
- def self.formatted_date(date)
71
- Time.parse(date.to_s).strftime('%Y-%m-%d')
72
- rescue
73
- false
74
- end
75
-
76
- def self.files
77
- FileUtils.cd(Ruhoh.paths.base) {
78
- return Dir["#{Ruhoh.names.posts}/**/*.*"].select { |filename|
79
- next unless self.is_valid_page?(filename)
80
- true
81
- }
82
- }
83
- end
84
-
85
- def self.is_valid_page?(filepath)
86
- return false if FileTest.directory?(filepath)
87
- return false if ['.'].include? filepath[0]
88
- Ruhoh.config.posts_exclude.each {|regex| return false if filepath =~ regex }
89
- true
90
- end
91
-
92
- def self.ordered_posts(dictionary)
93
- ordered_posts = []
94
- dictionary.each_value { |val| ordered_posts << val }
95
- ordered_posts.sort! {
96
- |a,b| Date.parse(b['date']) <=> Date.parse(a['date'])
97
- }
98
-
99
- ordered_posts
100
- end
101
-
102
- def self.parse_page_filename(filename)
103
- data = *filename.match(DateMatcher)
104
- data = *filename.match(Matcher) if data.empty?
105
- return {} if data.empty?
106
-
107
- if filename =~ DateMatcher
108
- {
109
- "path" => data[1],
110
- "date" => data[2],
111
- "slug" => data[3],
112
- "title" => self.to_title(data[3]),
113
- "extension" => data[4]
114
- }
115
- else
116
- {
117
- "path" => data[1],
118
- "slug" => data[2],
119
- "title" => self.to_title(data[2]),
120
- "extension" => data[3]
121
- }
122
- end
123
- end
124
-
125
- # my-post-title ===> My Post Title
126
- def self.to_title(file_slug)
127
- file_slug.gsub(/[^\p{Word}+]/u, ' ').gsub(/\b\w/){$&.upcase}
128
- end
129
-
130
- # Used in the client implementation to turn a draft into a post.
131
- def self.to_filename(data)
132
- File.join(Ruhoh.paths.posts, "#{Ruhoh::Urls.to_slug(data['title'])}.#{data['ext']}")
133
- end
134
-
135
- # Another blatently stolen method from Jekyll
136
- # The category is only the first one if multiple categories exist.
137
- def self.permalink(post)
138
- date = Date.parse(post['date'])
139
- title = Ruhoh::Urls.to_url_slug(post['title'])
140
- format = post['permalink'] || Ruhoh.config.posts_permalink
141
-
142
- if format.include?(':')
143
- filename = File.basename(post['id'], File.extname(post['id']))
144
- category = Array(post['categories'])[0]
145
- category = category.split('/').map {|c| Ruhoh::Urls.to_url_slug(c) }.join('/') if category
146
-
147
- url = {
148
- "year" => date.strftime("%Y"),
149
- "month" => date.strftime("%m"),
150
- "day" => date.strftime("%d"),
151
- "title" => title,
152
- "filename" => filename,
153
- "i_day" => date.strftime("%d").to_i.to_s,
154
- "i_month" => date.strftime("%m").to_i.to_s,
155
- "categories" => category || '',
156
- }.inject(format) { |result, token|
157
- result.gsub(/:#{Regexp.escape token.first}/, token.last)
158
- }.gsub(/\/+/, "/")
159
- else
160
- # Use the literal permalink if it is a non-tokenized string.
161
- url = format.gsub(/^\//, '').split('/').map {|p| CGI::escape(p) }.join('/')
162
- end
163
-
164
- Ruhoh::Urls.to_url(url)
165
- end
166
-
167
- def self.build_chronology(ordered_posts)
168
- ordered_posts.map { |post| post['id'] }
169
- end
170
-
171
- # Internal: Create a collated posts data structure.
172
- #
173
- # posts - Required [Array]
174
- # Must be sorted chronologically beforehand.
175
- #
176
- # [{ 'year': year,
177
- # 'months' : [{ 'month' : month,
178
- # 'posts': [{}, {}, ..] }, ..] }, ..]
179
- #
180
- def self.collate(ordered_posts)
181
- collated = []
182
- ordered_posts.each_with_index do |post, i|
183
- thisYear = Time.parse(post['date']).strftime('%Y')
184
- thisMonth = Time.parse(post['date']).strftime('%B')
185
- if (i-1 >= 0)
186
- prevYear = Time.parse(ordered_posts[i-1]['date']).strftime('%Y')
187
- prevMonth = Time.parse(ordered_posts[i-1]['date']).strftime('%B')
188
- end
189
-
190
- if(prevYear == thisYear)
191
- if(prevMonth == thisMonth)
192
- collated.last['months'].last['posts'] << post['id'] # append to last year & month
193
- else
194
- collated.last['months'] << {
195
- 'month' => thisMonth,
196
- 'posts' => [post['id']]
197
- } # create new month
198
- end
199
- else
200
- collated << {
201
- 'year' => thisYear,
202
- 'months' => [{
203
- 'month' => thisMonth,
204
- 'posts' => [post['id']]
205
- }]
206
- } # create new year & month
207
- end
208
-
209
- end
210
-
211
- collated
212
- end
213
-
214
- def self.parse_tags(ordered_posts)
215
- tags = {}
216
-
217
- ordered_posts.each do |post|
218
- Array(post['tags']).each do |tag|
219
- if tags[tag]
220
- tags[tag]['count'] += 1
221
- else
222
- tags[tag] = {
223
- 'count' => 1,
224
- 'name' => tag,
225
- 'posts' => []
226
- }
227
- end
228
-
229
- tags[tag]['posts'] << post['id']
230
- end
231
- end
232
- tags
233
- end
234
-
235
- def self.parse_categories(ordered_posts)
236
- categories = {}
237
-
238
- ordered_posts.each do |post|
239
- Array(post['categories']).each do |cat|
240
- cat = Array(cat).join('/')
241
- if categories[cat]
242
- categories[cat]['count'] += 1
243
- else
244
- categories[cat] = {
245
- 'count' => 1,
246
- 'name' => cat,
247
- 'posts' => []
248
- }
249
- end
250
-
251
- categories[cat]['posts'] << post['id']
252
- end
253
- end
254
- categories
255
- end
256
-
257
- end # Post
258
- end #Parsers
259
- end #Ruhoh