pagemaster 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/pagemaster.rb +103 -0
  3. metadata +58 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 85693645a299d6fdaf96300cac4bb14965a30ec8
4
+ data.tar.gz: 5ded4953bc2f0f3fb9a44766c0074dbf8b9e58e3
5
+ SHA512:
6
+ metadata.gz: d684b86103dc4dbb49e5d019c6a69ae1d4b1b121fa5813ce216fb1b9d3831baa7108f2eeca0e5590967208e1a4574cf5f8583078aba54d035c8bc42ea5d2923d
7
+ data.tar.gz: 077cc16aa4c5a9b51540b88d979ab517aeff689f70720d9da1c72495d70bc29b2f185e72294241154300180d48506cdf222eb5b8834100d298d35f2770efb89a
@@ -0,0 +1,103 @@
1
+ require 'yaml'
2
+ require 'csv'
3
+
4
+ Jekyll::Hooks.register :site, :after_reset do |site| # when site is re/built
5
+
6
+ for collection in site.collections
7
+ collection = collection[1]
8
+ if collection.metadata["output"] && collection.metadata["pm_generate"]
9
+
10
+ # grab collection variables from config
11
+ @input = collection.metadata["pm_input"].to_s
12
+ @dir = collection.metadata["pm_directory"].to_s
13
+ @name_key = collection.metadata["pm_key"].to_s
14
+ @src = collection.metadata["pm_source"].to_s
15
+ @layout = collection.metadata["pm_layout"].to_s
16
+
17
+ @layout ||= @src
18
+ @src = @src + "." + @input
19
+
20
+ # check if input is csv or yaml
21
+ unless @input == 'yaml' or @input == 'csv'
22
+ raise "pagemaster :: Input must be 'csv' or 'yaml'."
23
+ end
24
+
25
+ # check usability of dir name. gsub alphanumerics to (especially) avoid leading double underscores. then make directory.
26
+ if @dir.empty?
27
+ raise "pagemaster :: Target directory is undefined or unusable. Cannot generate pages. Specify dir in config and rebuild."
28
+ else
29
+ @targetdir = "_" + @dir.downcase.gsub(/[^\0-9a-z]/, '').to_s
30
+ FileUtils::mkdir_p @targetdir
31
+ puts ">> pagemaster :: Made directory " + @targetdir + " in root."
32
+ end
33
+
34
+ # check usability of name_key, to be used later when naming generated pages
35
+ if @name_key.empty?
36
+ raise "pagemaster :: pm_key is undefined or unusable. Cannot generate pages. Specify pm_key in config and rebuild."
37
+ end
38
+
39
+ def ingest(src) # takes + opens src file
40
+ begin
41
+ puts ">> pagemaster :: Loaded " + src + "."
42
+ if @input == 'yaml'
43
+ return YAML.load_file('_data/' + src)
44
+ else
45
+ return CSV.read('_data/' + src, :headers => true).map(&:to_hash)
46
+ end
47
+ rescue
48
+ raise "pagemaster :: Cannot load " + src + ". Check for typos and rebuild."
49
+ end
50
+ end
51
+
52
+ def uniqify(hashes, key) # takes opened src file as hash array
53
+ occurences = {} # hash list of slug names and # of occurences
54
+ hashes.each do |item|
55
+ if item[key].nil?
56
+ raise "pagemaster :: Source file has at least one missing value for pm_key='" + key + "'. Cannot generate page."
57
+ end
58
+ new_name = item[key].downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '').gsub(/-+/, '-') # gsub for slug
59
+ if occurences.has_key? new_name
60
+ occurences[new_name]+=1
61
+ safe_slug = new_name + "-" + occurences[new_name].to_s
62
+ else
63
+ occurences.store(new_name, 1)
64
+ safe_slug = new_name
65
+ end
66
+ item.store("slug", safe_slug)
67
+ end
68
+ return hashes # return changed yml array with unique, slugified names added
69
+ end
70
+
71
+ # ingest data source, sort it and generate unique titles
72
+ data = uniqify(ingest(@src), @name_key)
73
+
74
+ # keep track of (valid) pages generated vs. (untitled, nonunique) pages skipped.
75
+ untitled, nonunique, valid = 0, 0, 0
76
+
77
+ # make pages
78
+ data.each do |item|
79
+ pagename = item["slug"]
80
+ pagepath = @targetdir + "/" + pagename + ".md"
81
+ layout_str = ""
82
+ unless @layout.empty?
83
+ layout_str = "layout: " + @layout
84
+ end
85
+ if pagename.empty?
86
+ puts ">> pagemaster :: Title for item is unspecified. Cannot generate page."
87
+ untitled+=1
88
+ elsif !File.exist?(pagepath)
89
+ File.open(pagepath, 'w') { |file| file.write( item.to_yaml.to_s + layout_str + "\n---" ) }
90
+ valid+=1
91
+ else
92
+ puts ">> pagemaster :: " + pagename + ".md already exits."
93
+ nonunique+=1
94
+ end
95
+ end
96
+
97
+ # log outcomes
98
+ puts ">> pagemaster :: " + valid.to_s + " pages were generated from " + @src + " to " + @targetdir + " directory."
99
+ puts ">> pagemaster :: " + nonunique.to_s + " items were skipped because of non-unique names."
100
+ puts ">> pagemaster :: " + untitled.to_s + " items were skipped because of missing titles."
101
+ end
102
+ end
103
+ end
metadata ADDED
@@ -0,0 +1,58 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pagemaster
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Marii Nyröp
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-10-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: jekyll
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
27
+ description: jekyll .md page generator plugin from csv or yaml files
28
+ email:
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - lib/pagemaster.rb
34
+ homepage: https://github.com/mnyrop/pagemaster
35
+ licenses:
36
+ - MIT
37
+ metadata: {}
38
+ post_install_message:
39
+ rdoc_options: []
40
+ require_paths:
41
+ - lib
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ required_rubygems_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: '0'
52
+ requirements: []
53
+ rubyforge_project:
54
+ rubygems_version: 2.6.14
55
+ signing_key:
56
+ specification_version: 4
57
+ summary: jekyll pagemaster plugin
58
+ test_files: []