wax_tasks 0.0.46 → 0.0.47

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '08373f20a96f8beb7d8da2f0080874f53434ca22946e978f1810341f8b0d0789'
4
- data.tar.gz: d519743109cc40019c40b2ff0cb53165c9f35e7b8e37ba3bf849a64b240157bc
3
+ metadata.gz: 2eb86783ae6e09758e23af201aad5907f68d0f7ee0034d46bd168830264d9a74
4
+ data.tar.gz: a1261162881c112780ff5d342cc265389b2bffdc121952d123b1176f36dc31ac
5
5
  SHA512:
6
- metadata.gz: 336d3b60f04a17515e95d55d2787ef8243b9bdbbc634ff52ede4e64745269e54149995e7df8bf586a035c074136c195c3d5484a0052028a20d1b0a19fb872150
7
- data.tar.gz: 7576e0dd98d98ef35b3b89c1908969553e9edd0905d06f92610e16bd5ee886d569e6ede8e0e4f1eb92cd9c0cf69e59834d88123a6294ed6538d68a9a42b72127
6
+ metadata.gz: c6c7e4e7874f80c9073b51865ab46f1c39d01cc3993531df218d17f87badb2d242a36aa9346a7a7e237c664ccf9bfb6b95f180fd92f0ee230486eafc7e6058d4
7
+ data.tar.gz: ce6b90ea4d1cbf605e162a797c62d2aee01d15eeffdc980989661f9c68f746d1fe35064abd00c3fe70649520391630d41a8ae76a90899be66bdc0e1cd40ef375
@@ -0,0 +1,49 @@
1
+ require 'json'
2
+ require 'wax_iiif'
3
+
4
+ # module for generating IIIF derivatives + json from local images
5
+ module Iiif
6
+ include FileUtils
7
+
8
+ def self.ingest_collections(args, site_config)
9
+ mkdir_p('./iiif', :verbose => false)
10
+ all_records = []
11
+ id_counter = 0
12
+ build_opts = Iiif.build_options(site_config)
13
+ args.each do |a|
14
+ id_counter += 1
15
+ inpath = './_data/iiif/' + a
16
+ abort "Source path '#{inpath}' does not exist. Exiting.".magenta unless Dir.exist?(inpath)
17
+ collection_records = make_records(a, inpath)
18
+ all_records.concat collection_records
19
+ end
20
+ builder = IiifS3::Builder.new(build_opts)
21
+ builder.load(all_records)
22
+ builder.process_data
23
+ end
24
+
25
+ def self.build_options(site_config)
26
+ {
27
+ :base_url => site_config['baseurl'] + '/iiif',
28
+ :output_dir => './iiif',
29
+ :verbose => true
30
+ }
31
+ end
32
+
33
+ def self.make_records(arg, inpath)
34
+ counter = 1
35
+ records = []
36
+ imagefiles = Dir[inpath + '/*'].sort!
37
+ imagefiles.each do |imagefile|
38
+ basename = File.basename(imagefile, '.*').to_s
39
+ record_opts = {
40
+ :id => arg + '-' + basename,
41
+ :path => imagefile,
42
+ :label => arg + ' - ' + basename
43
+ }
44
+ counter += 1
45
+ records << IiifS3::ImageRecord.new(record_opts)
46
+ end
47
+ records
48
+ end
49
+ end
@@ -0,0 +1,107 @@
1
+ include FileUtils
2
+ require 'json'
3
+
4
+ # module for generating elasticlunr index and default jquery ui
5
+ module Lunr
6
+ def self.total_fields(collections)
7
+ total_fields = ['pid']
8
+ collections.each do |c|
9
+ total_fields = total_fields.concat(c[1]['lunr_index']['fields'])
10
+ total_fields << 'content' if c[1]['lunr_index']['content']
11
+ end
12
+ total_fields.uniq
13
+ end
14
+
15
+ def self.collections(site_config)
16
+ site_config['collections'].find_all { |c| c[1].key?('lunr_index') && c[1]['lunr_index'].key?('fields') }
17
+ end
18
+
19
+ def self.index(cdir, collections)
20
+ index = []
21
+ count = 0
22
+ abort 'There are no valid collections to index.'.magenta if collections.nil?
23
+
24
+ collections.each do |c|
25
+ dir = cdir + '_' + c[0]
26
+ fields = c[1]['lunr_index']['fields'].uniq
27
+ pages = Dir.glob(dir + '/*.md')
28
+ get_content = c[1]['lunr_index']['content']
29
+ # catch
30
+ abort "There are no markdown pages in directory '#{dir}'".magenta if pages.empty?
31
+ abort "There are no fields specified for #{c[0]}.".magenta if fields.empty?
32
+ puts "Loading #{pages.length} pages from #{dir}"
33
+ # index each page in collection
34
+ pages.each do |page|
35
+ index << page_hash(page, fields, get_content, count)
36
+ count += 1
37
+ end
38
+ end
39
+ JSON.pretty_generate(index)
40
+ end
41
+
42
+ def self.page_hash(page, fields, get_content, count)
43
+ yaml = YAML.load_file(page)
44
+ hash = {
45
+ 'lunr_id' => count,
46
+ 'link' => "{{'" + yaml.fetch('permalink') + "' | relative_url }}"
47
+ }
48
+ fields.each { |f| hash[f] = rm_diacritics(thing2string(yaml[f])) }
49
+ hash['content'] = rm_diacritics(clean(File.read(page))) if get_content
50
+ hash
51
+ end
52
+
53
+ def self.ui(total_fields)
54
+ # set up index
55
+ ui_string = "$.getJSON(\"{{ site.baseurl }}/js/lunr-index.json\", function(index_json) {\nwindow.index = new elasticlunr.Index;\nwindow.store = index_json;\nindex.saveDocument(false);\nindex.setRef('lunr_id');"
56
+ # add fields to index
57
+ total_fields.each { |field| ui_string += "\nindex.addField('#{field}');" }
58
+ # add docs
59
+ ui_string += "\n// add docs\nfor (i in store){index.addDoc(store[i]);}"
60
+ # gui
61
+ ui_string += "\n$('input#search').on('keyup', function() {\nvar results_div = $('#results');\nvar query = $(this).val();\nvar results = index.search(query, { boolean: 'AND', expand: true });\nresults_div.empty();\nif (results.length > 10) {\nresults_div.prepend(\"<p><small>Displaying 10 of \" + results.length + \" results.</small></p>\");\n}\nfor (var r in results.slice(0, 9)) {\nvar ref = results[r].ref;\nvar item = store[ref];"
62
+ # add fields as display vars
63
+ total_fields.each { |field| ui_string += "var #{field} = item.#{field};\n" }
64
+ ui_string += "var result = '<div class=\"result\"><b><a href=\"' + item.link + '\">' + title + '</a></b></p></div>';\nresults_div.append(result);\n}\n});\n});"
65
+ ui_string
66
+ end
67
+
68
+ def self.write_index(index)
69
+ mkdir_p('js')
70
+ index = "---\nlayout: none\n---\n" + index
71
+ path = 'js/lunr-index.json'
72
+ File.open(path, 'w') { |file| file.write(index) }
73
+ puts "Writing lunr index to #{path}".cyan
74
+ end
75
+
76
+ def self.write_ui(ui)
77
+ ui = "---\nlayout: none\n---\n" + ui
78
+ path = 'js/lunr-ui.js'
79
+ if File.exist?(path)
80
+ puts "Lunr UI already exists at #{path}. Skipping".cyan
81
+ else
82
+ File.open(path, 'w') { |file| file.write(ui) }
83
+ puts "Writing lunr ui to #{path}".cyan
84
+ end
85
+ end
86
+
87
+ def self.clean(str)
88
+ str.gsub!(/\A---(.|\n)*?---/, '') # remove yaml front matter
89
+ str.gsub!(/{%(.*)%}/, '') # remove functional liquid
90
+ str.gsub!(/<\/?[^>]*>/, '') # remove html
91
+ str.gsub!('\\n', '') # remove newlines
92
+ str.gsub!(/\s+/, ' ') # remove extra space
93
+ str.tr!('"', "'") # replace double quotes with single
94
+ str
95
+ end
96
+
97
+ def self.rm_diacritics(str)
98
+ to_replace = 'ÀÁÂÃÄÅàáâãäåĀāĂ㥹ÇçĆćĈĉĊċČčÐðĎďĐđÈÉÊËèéêëĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħÌÍÎÏìíîïĨĩĪīĬĭĮįİıĴĵĶķĸĹĺĻļĽľĿŀŁłÑñŃńŅņŇňʼnŊŋÒÓÔÕÖØòóôõöøŌōŎŏŐőŔŕŖŗŘřŚśŜŝŞşŠšſŢţŤťŦŧÙÚÛÜùúûüŨũŪūŬŭŮůŰűŲųŴŵÝýÿŶŷŸŹźŻżŽž'
99
+ replaced_by = 'AAAAAAaaaaaaAaAaAaCcCcCcCcCcDdDdDdEEEEeeeeEeEeEeEeEeGgGgGgGgHhHhIIIIiiiiIiIiIiIiIiJjKkkLlLlLlLlLlNnNnNnNnnNnOOOOOOooooooOoOoOoRrRrRrSsSsSsSssTtTtTtUUUUuuuuUuUuUuUuUuUuWwYyyYyYZzZzZz'
100
+ str.tr(to_replace, replaced_by)
101
+ end
102
+
103
+ def self.thing2string(thing)
104
+ thing = thing.join(' || ') if thing.is_a?(Array)
105
+ thing.to_s
106
+ end
107
+ end
@@ -0,0 +1,68 @@
1
+ require 'json'
2
+ require 'yaml'
3
+ require 'csv'
4
+
5
+ # module for generating markdown collection pages from csv/json/yaml records
6
+ module Pagemaster
7
+ include FileUtils
8
+
9
+ def self.valid_config(name, site_config)
10
+ abort "Cannot find #{name} in _config.yml. Exiting.".magenta unless site_config['collections'].key?(name)
11
+ collection_config = site_config['collections'][name]
12
+ abort "Cannot find source for '#{name}'. Exiting.".magenta unless collection_config['source']
13
+ abort "Cannot find layout for '#{name}'. Exiting.".magenta unless collection_config['layout']
14
+ abort "Cannot find the file _data/#{collection_config['source']}.".magenta unless File.file?('_data/' + collection_config['source'])
15
+ collection_config
16
+ end
17
+
18
+ def self.ingest(src)
19
+ src = "_data/#{src}"
20
+ case File.extname(src)
21
+ when '.csv' then data = CSV.read(src, :headers => true, :encoding => 'utf-8').map(&:to_hash)
22
+ when '.json' then data = JSON.parse(File.read(src))
23
+ when '.yml' then data = YAML.load_file(src)
24
+ else abort "File type for #{src} must be .csv, .json, or .yml. Please fix and rerun."
25
+ end
26
+ puts "Processing #{src}...."
27
+ detect_duplicates(data)
28
+ data
29
+ rescue StandardError
30
+ puts "Cannot load #{src}. check for typos and rebuild.".magenta
31
+ end
32
+
33
+ def self.generate_pages(data, name, layout, cdir, order, perma)
34
+ dir = cdir + '_' + name
35
+ mkdir_p(dir)
36
+ completed = 0
37
+ skipped = 0
38
+ data.each_with_index do |item, index|
39
+ pagename = WaxTasks.slug(item.fetch('pid'))
40
+ pagepath = dir + '/' + pagename + '.md'
41
+ if File.exist?(pagepath)
42
+ puts "#{pagename}.md already exits. Skipping."
43
+ skipped += 1
44
+ else
45
+ item['permalink'] = '/' + name + '/' + pagename + perma
46
+ item['layout'] = layout
47
+ item['order'] = padded_int(index, data.length) if order
48
+ File.open(pagepath, 'w') { |f| f.write(item.to_yaml.to_s + '---') }
49
+ completed += 1
50
+ end
51
+ end
52
+ puts "\n#{completed} pages were generated to #{dir} directory.".cyan
53
+ puts "\n#{skipped} pre-existing items were skipped.".cyan
54
+ rescue StandardError
55
+ abort "#{completed} pages were generated before failure, most likely a record is missing a valid 'pid' value.".magenta
56
+ end
57
+
58
+ def self.detect_duplicates(data)
59
+ pids = []
60
+ data.each { |d| pids << d['pid'] }
61
+ duplicates = pids.detect { |p| pids.count(p) > 1 } || []
62
+ abort "\nYour collection has the following duplicate pids: \n#{duplicates}".magenta unless duplicates.empty?
63
+ end
64
+
65
+ def self.padded_int(index, max_idx)
66
+ index.to_s.rjust(Math.log10(max_idx).to_i + 1, '0')
67
+ end
68
+ end
data/lib/tasks/iiif.rake CHANGED
@@ -4,53 +4,9 @@ require 'wax_iiif'
4
4
 
5
5
  namespace :wax do
6
6
  task :iiif do
7
- config = read_config
8
- argv = read_argv
9
-
10
- abort "You must specify a collections after 'bundle exec rake wax:iiif'.".magenta if argv.empty?
11
-
12
- mkdir_p('./iiif')
13
-
14
- all_records = []
15
- id_counter = 0
16
- build_opts = build_options(config)
17
-
18
- argv.each do |a|
19
- id_counter += 1
20
- inpath = './_data/iiif/' + a
21
- abort "Source path '#{inpath}' does not exist. Exiting.".magenta unless Dir.exist?(inpath)
22
- paged = config['collections'][a]['iiif_paged'] == true
23
- collection_records = make_records(a, inpath, paged, config)
24
- all_records.concat collection_records
25
- end
26
- builder = IiifS3::Builder.new(build_opts)
27
- builder.load(all_records)
28
- builder.process_data
29
- end
30
- end
31
-
32
- def build_options(config)
33
- {
34
- :base_url => config['baseurl'] + '/iiif',
35
- :output_dir => './iiif',
36
- :verbose => true
37
- }
38
- end
39
-
40
- def make_records(collection_name, inpath, paged, config)
41
- counter = 1
42
- collection_records = []
43
- imagefiles = Dir[inpath + '/*'].sort!
44
- imagefiles.each do |imagefile|
45
- basename = File.basename(imagefile, '.*').to_s
46
- record_opts = {
47
- :id => collection_name + '-' + basename,
48
- :is_document => paged,
49
- :path => imagefile,
50
- :label => config['title'] + ' - ' + collection_name + ' - ' + basename
51
- }
52
- counter += 1
53
- collection_records << IiifS3::ImageRecord.new(record_opts)
7
+ args = ARGV.drop(1).each { |a| task a.to_sym }
8
+ site_config = WaxTasks.config
9
+ abort "You must specify a collections after 'bundle exec rake wax:iiif'.".magenta if args.empty?
10
+ WaxTasks.iiif(args, site_config)
54
11
  end
55
- collection_records
56
12
  end
@@ -4,15 +4,15 @@ require 'json'
4
4
  namespace :wax do
5
5
  desc 'write a simple package.json'
6
6
  task :jspackage do
7
- config = read_config
7
+ site_config = WaxTasks.config
8
8
  package = {
9
- 'name' => config['title'],
9
+ 'name' => site_config['title'],
10
10
  'version' => '1.0.0',
11
- 'description' => config['description'],
11
+ 'description' => site_config['description'],
12
12
  'dependencies' => {}
13
13
  }
14
14
  names = []
15
- config['js'].each do |dependency|
15
+ site_config['js'].each do |dependency|
16
16
  name = dependency[0]
17
17
  names << name
18
18
  version = dependency[1]['version']
data/lib/tasks/lunr.rake CHANGED
@@ -1,28 +1,9 @@
1
1
  require 'wax_tasks'
2
- require 'json'
3
2
 
4
3
  namespace :wax do
5
4
  desc 'build lunr search index'
6
5
  task :lunr do
7
- config = read_config
8
- Dir.mkdir('js') unless File.exist?('js')
9
- yaml = "---\nlayout: none\n---\n"
10
- lunr = Lunr.new(config)
11
-
12
- # write index to json file
13
- idx = yaml + lunr.index
14
- idx_path = 'js/lunr-index.json'
15
- File.open(idx_path, 'w') { |file| file.write(idx) }
16
- puts "Writing lunr index to #{idx_path}".cyan
17
-
18
- # write index.ui to js file
19
- ui = yaml + lunr.ui
20
- ui_path = 'js/lunr-ui.js'
21
- if File.exist?(ui_path)
22
- puts "Lunr UI already exists at #{ui_path}. Skipping".cyan
23
- else
24
- File.open(ui_path, 'w') { |file| file.write(ui) }
25
- puts "Writing lunr index to #{ui_path}".cyan
26
- end
6
+ site_config = WaxTasks.config
7
+ WaxTasks.lunr(site_config)
27
8
  end
28
9
  end
@@ -3,16 +3,12 @@ require 'wax_tasks'
3
3
  namespace :wax do
4
4
  desc 'generate collection md pages from yaml or csv data source'
5
5
  task :pagemaster do
6
- config = read_config
7
- argv = read_argv
8
- if argv.empty?
9
- puts "You must specify one or more collections after 'bundle exec rake wax:pagemaster' to generate.".magenta
10
- exit 1
6
+ args = ARGV.drop(1).each { |a| task a.to_sym }
7
+ site_config = WaxTasks.config
8
+ if args.empty?
9
+ abort "You must specify one or more collections after 'rake wax:pagemaster' to generate.".magenta
11
10
  else
12
- argv.each do |name|
13
- collection = Collection.new(config, name)
14
- collection.pagemaster
15
- end
11
+ args.each { |a| WaxTasks.pagemaster(a, site_config) }
16
12
  end
17
13
  end
18
14
  end
@@ -8,7 +8,8 @@ namespace :wax do
8
8
  task :gh do
9
9
  if ENV['CI']
10
10
  REPO_SLUG = ENV['TRAVIS_REPO_SLUG']
11
- USER = REPO_SLUG.split("/")[0]
11
+ USER = REPO_SLUG.split('/')[0]
12
+ REPO_NAME = '1' + REPO_SLUG.split('/')[1]
12
13
  TOKEN = ENV['ACCESS_TOKEN']
13
14
  COMMIT_MSG = "Site updated via #{ENV['TRAVIS_COMMIT']}".freeze
14
15
  ORIGIN = "https://#{USER}:#{TOKEN}@github.com/#{REPO_SLUG}.git".freeze
@@ -16,16 +17,18 @@ namespace :wax do
16
17
  else
17
18
  ORIGIN = `git config --get remote.origin.url`.freeze
18
19
  COMMIT_MSG = "Site updated at #{Time.now.utc}".freeze
19
- puts "Deploying to gh-pages branch from local task"
20
+ puts 'Deploying to gh-pages branch from local task'
20
21
  end
21
22
  config = read_config
22
23
  rm_rf('_site')
23
24
 
25
+ baseurl = config['gh-baseurl'] || REPO_NAME.to_s
26
+
24
27
  opts = {
25
28
  'source' => '.',
26
29
  'destination' => '_site',
27
30
  'config' => '_config.yml',
28
- 'baseurl' => config['gh-baseurl']
31
+ 'baseurl' => baseurl
29
32
  }
30
33
 
31
34
  Jekyll::Site.new(Jekyll.configuration(opts)).process
@@ -34,7 +37,7 @@ namespace :wax do
34
37
  Dir.chdir tmp
35
38
  system 'git init'
36
39
  system "git add . && git commit -m '#{COMMIT_MSG}'"
37
- system 'git remote add origin ' + ORIGIN
40
+ system "git remote add origin #{ORIGIN}"
38
41
  system 'git push origin master:refs/heads/gh-pages --force'
39
42
  end
40
43
  end
@@ -7,7 +7,7 @@ namespace :wax do
7
7
  task :s3 do
8
8
  if ENV['CI']
9
9
  REPO_SLUG = ENV['TRAVIS_REPO_SLUG']
10
- USER = REPO_SLUG.split("/")[0]
10
+ USER = REPO_SLUG.split('/')[0]
11
11
  TOKEN = ENV['ACCESS_TOKEN']
12
12
  COMMIT_MSG = "Site updated via #{ENV['TRAVIS_COMMIT']}".freeze
13
13
  ORIGIN = "https://#{USER}:#{TOKEN}@github.com/#{REPO_SLUG}.git".freeze
@@ -15,7 +15,7 @@ namespace :wax do
15
15
  else
16
16
  ORIGIN = `git config --get remote.origin.url`.freeze
17
17
  COMMIT_MSG = "Site updated at #{Time.now.utc}".freeze
18
- puts "Deploying to s3 branch from local task"
18
+ puts 'Deploying to s3 branch from local task'
19
19
  end
20
20
 
21
21
  Dir.mktmpdir do |tmp|
@@ -23,7 +23,7 @@ namespace :wax do
23
23
  Dir.chdir tmp
24
24
  system 'git init'
25
25
  system "git add . && git commit -m '#{COMMIT_MSG}'"
26
- system 'git remote add origin ' + ORIGIN
26
+ system "git remote add origin #{ORIGIN}"
27
27
  system 'git push origin master:refs/heads/s3 --force'
28
28
  end
29
29
  end
data/lib/wax_tasks.rb CHANGED
@@ -1,3 +1,46 @@
1
- require 'wax_tasks/collection'
2
- require 'wax_tasks/helpers'
3
- require 'wax_tasks/lunr'
1
+ require_relative 'modules/iiif'
2
+ require_relative 'modules/lunr'
3
+ require_relative 'modules/pagemaster'
4
+
5
+ require 'yaml'
6
+ require 'wax_iiif'
7
+
8
+ # umbrella module for registering task modules
9
+ module WaxTasks
10
+ def self.pagemaster(name, site_config)
11
+ collection_config = Pagemaster.valid_config(name, site_config)
12
+
13
+ src = collection_config['source']
14
+ data = Pagemaster.ingest(src)
15
+ layout = collection_config.fetch('layout').to_s
16
+ perma = config['permalink'] == 'pretty' ? '/' : '.html'
17
+ cdir = site_config['collections_dir'].to_s
18
+ order = collection_config.key?('keep_order') ? collection_config.fetch('keep_order') : false
19
+
20
+ Pagemaster.generate_pages(data, name, layout, cdir, order, perma)
21
+ end
22
+
23
+ def self.lunr(site_config)
24
+ cdir = site_config['collections_dir'].to_s
25
+ collections = Lunr.collections(site_config)
26
+ total_fields = Lunr.total_fields(collections)
27
+
28
+ index = Lunr.index(cdir, collections)
29
+ ui = Lunr.ui(total_fields)
30
+
31
+ Lunr.write_index(index)
32
+ Lunr.write_ui(ui)
33
+ end
34
+
35
+ def self.iiif(args, site_config)
36
+ Iiif.ingest_collections(args, site_config)
37
+ end
38
+
39
+ def self.config
40
+ YAML.load_file('_config.yml')
41
+ end
42
+
43
+ def self.slug(str)
44
+ str.downcase.tr(' ', '_').gsub(/[^:\w-]/, '')
45
+ end
46
+ end
data/spec/spec_helper.rb CHANGED
@@ -1 +1,70 @@
1
- require 'test_tasks'
1
+ require 'fileutils'
2
+
3
+ require_relative 'fake/data'
4
+ require_relative 'fake/site'
5
+
6
+ $LOAD_PATH.unshift File.expand_path('../lib', __dir__)
7
+ require 'wax_tasks'
8
+
9
+ Fake.site
10
+ Fake.data
11
+
12
+ describe 'wax:pagemaster' do
13
+ config = WaxTasks.config
14
+ args = config['collections'].map { |c| c[0] }
15
+ system("bundle exec rake wax:pagemaster #{args.join(' ')} > /dev/null")
16
+ it 'generates directories' do
17
+ args.each { |a| expect(Dir.exist?('_' + a)) }
18
+ end
19
+ it 'generates pages' do
20
+ args.each { |a| expect(Dir.glob("_#{a}/*.md")) }
21
+ end
22
+ end
23
+
24
+ describe 'wax:lunr' do
25
+ system('bundle exec rake wax:lunr > /dev/null')
26
+ it 'generates a lunr index' do
27
+ index = File.open('js/lunr-index.json', 'r').read
28
+ expect(index.length > 1000)
29
+ end
30
+
31
+ it 'generates a lunr ui' do
32
+ ui = File.open('js/lunr-ui.js', 'r').read
33
+ expect(ui.length > 100)
34
+ end
35
+ end
36
+
37
+ describe 'wax:iiif' do
38
+ site_config = WaxTasks.config
39
+ args = site_config['collections'].map { |c| c[0] }
40
+
41
+ it 'generates iiif tiles and data' do
42
+ images = Dir.glob('./_data/iiif/*.jpg')
43
+ site_config['collections'].each do |c|
44
+ new_dir = './_data/iiif/' + c[0]
45
+ mkdir_p(new_dir)
46
+ images.each { |f| cp(File.expand_path(f), new_dir) }
47
+ end
48
+ rm_r(images)
49
+ system("bundle exec rake wax:iiif #{args.first} > /dev/null")
50
+ args.each { |a| expect(Dir.exist?('iiif/images' + a)) }
51
+ end
52
+ end
53
+
54
+ describe 'jekyll' do
55
+ it 'builds successfully' do
56
+ Bundler.with_clean_env { system('bundle exec jekyll build > /dev/null') }
57
+ end
58
+ end
59
+
60
+ describe 'wax:jspackage' do
61
+ system('bundle exec rake wax:jspackage > /dev/null')
62
+ it 'writes a package.json file' do
63
+ package = File.open('package.json', 'r').read
64
+ expect(package.length > 90)
65
+ end
66
+ end
67
+
68
+ describe 'wax:test' do
69
+ it 'passes html-proofer' do system('bundle exec rake wax:test > /dev/null') end
70
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wax_tasks
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.46
4
+ version: 0.0.47
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marii Nyrop
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-21 00:00:00.000000000 Z
11
+ date: 2018-03-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colorize
@@ -30,112 +30,112 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '3.0'
33
+ version: '3'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '3.0'
40
+ version: '3'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: jekyll
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '3.7'
47
+ version: '3'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '3.7'
54
+ version: '3'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '12.0'
61
+ version: '12'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '12.0'
68
+ version: '12'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: wax_iiif
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: 0.0.1
75
+ version: '0'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: 0.0.1
82
+ version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: bundler
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '1.16'
89
+ version: '1'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '1.16'
96
+ version: '1'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: faker
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '1.8'
103
+ version: '1'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '1.8'
110
+ version: '1'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: rspec
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '3.5'
117
+ version: '3'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '3.5'
124
+ version: '3'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: rubocop
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - "~>"
129
+ - - ">="
130
130
  - !ruby/object:Gem::Version
131
- version: '0.53'
131
+ version: '0.5'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - "~>"
136
+ - - ">="
137
137
  - !ruby/object:Gem::Version
138
- version: '0.53'
138
+ version: '0.5'
139
139
  description: Rake tasks for minimal iiif exhibition sites with Jekyll.
140
140
  email:
141
141
  - m.nyrop@columbia.edu
@@ -144,6 +144,9 @@ extensions: []
144
144
  extra_rdoc_files: []
145
145
  files:
146
146
  - Gemfile
147
+ - lib/modules/iiif.rb
148
+ - lib/modules/lunr.rb
149
+ - lib/modules/pagemaster.rb
147
150
  - lib/tasks/iiif.rake
148
151
  - lib/tasks/jspackage.rake
149
152
  - lib/tasks/lunr.rake
@@ -152,11 +155,7 @@ files:
152
155
  - lib/tasks/push_s3.rake
153
156
  - lib/tasks/test.rake
154
157
  - lib/wax_tasks.rb
155
- - lib/wax_tasks/collection.rb
156
- - lib/wax_tasks/helpers.rb
157
- - lib/wax_tasks/lunr.rb
158
158
  - spec/spec_helper.rb
159
- - spec/test_tasks.rb
160
159
  homepage: https://github.com/mnyrop/wax_tasks
161
160
  licenses:
162
161
  - MIT
@@ -183,4 +182,3 @@ specification_version: 4
183
182
  summary: Rake tasks for minimal exhibitions.
184
183
  test_files:
185
184
  - spec/spec_helper.rb
186
- - spec/test_tasks.rb
@@ -1,81 +0,0 @@
1
- include FileUtils
2
- require 'csv'
3
- require 'json'
4
-
5
- # initializes a wax collection for use with pagemaster,lunr,and iiif tasks
6
- class Collection
7
- def initialize(config, collection_name)
8
- @name = collection_name
9
- @config = config
10
-
11
- cdir = @config['collections_dir'].nil? ? '' : @config.fetch('collections_dir').to_s + '/'
12
- collection = valid_collection_config
13
-
14
- @src = '_data/' + collection.fetch('source')
15
- @layout = File.basename(collection.fetch('layout'), '.*')
16
- @dir = cdir + '_' + @name
17
- @order = collection.key?('keep_order') ? collection.fetch('keep_order') : false
18
- end
19
-
20
- def valid_collection_config
21
- c = @config['collections'][@name]
22
- abort "Cannot find the collection #{@name} in _config.yml. Exiting.".magenta if c.nil?
23
- abort "Cannot find 'source' for the collection '#{@name}' in _config.yml. Exiting.".magenta if c['source'].nil?
24
- abort "Cannot find 'layout' for the collection '#{@name}' in _config.yml. Exiting.".magenta if c['layout'].nil?
25
- abort "Cannot find the file '#{'_data/' + c['source']}'. Exiting.".magenta unless File.file?('_data/' + c['source'])
26
- c
27
- end
28
-
29
- def ingest(src)
30
- if File.extname(src) == '.csv'
31
- data = CSV.read(src, :headers => true, :encoding => 'utf-8').map(&:to_hash)
32
- elsif File.extname(src) == '.json'
33
- data = JSON.parse(File.read(@src).encode("UTF-8"))
34
- else
35
- puts "File type for #{@src} must be .csv or .json. Please fix and rerun."
36
- exit 1
37
- end
38
- detect_duplicates(data)
39
- puts "Processing #{src}...."
40
- data
41
- rescue StandardError
42
- puts "Cannot load #{src}. check for typos and rebuild.".magenta
43
- end
44
-
45
- def generate_pages(data)
46
- perma_ext = @config['permalink'] == 'pretty' ? '/' : '.html'
47
- completed = 0
48
- skipped = 0
49
- data.each_with_index do |item, index|
50
- pagename = slug(item.fetch('pid'))
51
- pagepath = @dir + '/' + pagename + '.md'
52
- item['permalink'] = '/' + @name + '/' + pagename + perma_ext
53
- item['layout'] = @layout
54
- item['order'] = padded_int(index, data.length) if @order
55
- if File.exist?(pagepath)
56
- puts "#{pagename}.md already exits. Skipping."
57
- skipped += 1
58
- else
59
- File.open(pagepath, 'w') { |file| file.write(item.to_yaml.to_s + '---') }
60
- completed += 1
61
- end
62
- end
63
- puts "\n#{completed} pages were generated to #{@dir} directory.".cyan
64
- puts "\n#{skipped} pre-existing items were skipped.".cyan
65
- rescue StandardError
66
- abort "#{completed} pages were generated before failure, most likely a record is missing a valid 'pid' value.".magenta
67
- end
68
-
69
- def detect_duplicates(data)
70
- pids = []
71
- data.each { |d| pids << d['pid'] }
72
- duplicates = pids.detect { |p| pids.count(p) > 1 } || []
73
- raise "\nYour collection has the following duplicate ids. please fix and rerun.\n#{duplicates}".magenta unless duplicates.empty?
74
- end
75
-
76
- def pagemaster
77
- mkdir_p(@dir)
78
- data = ingest(@src)
79
- generate_pages(data)
80
- end
81
- end
@@ -1,38 +0,0 @@
1
- def clean(str)
2
- str.gsub!(/\A---(.|\n)*?---/, '') # remove yaml front matter
3
- str.gsub!(/{%(.*)%}/, '') # remove functional liquid
4
- str.gsub!(/<\/?[^>]*>/, '') # remove html
5
- str.gsub!('\\n', '') # remove newlines
6
- str.gsub!(/\s+/, ' ') # remove extra space
7
- str.tr!('"', "'") # replace double quotes with single
8
- str
9
- end
10
-
11
- def rm_diacritics(str)
12
- to_replace = "ÀÁÂÃÄÅàáâãäåĀāĂ㥹ÇçĆćĈĉĊċČčÐðĎďĐđÈÉÊËèéêëĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħÌÍÎÏìíîïĨĩĪīĬĭĮįİıĴĵĶķĸĹĺĻļĽľĿŀŁłÑñŃńŅņŇňʼnŊŋÒÓÔÕÖØòóôõöøŌōŎŏŐőŔŕŖŗŘřŚśŜŝŞşŠšſŢţŤťŦŧÙÚÛÜùúûüŨũŪūŬŭŮůŰűŲųŴŵÝýÿŶŷŸŹźŻżŽž"
13
- replaced_by = "AAAAAAaaaaaaAaAaAaCcCcCcCcCcDdDdDdEEEEeeeeEeEeEeEeEeGgGgGgGgHhHhIIIIiiiiIiIiIiIiIiJjKkkLlLlLlLlLlNnNnNnNnnNnOOOOOOooooooOoOoOoRrRrRrSsSsSsSssTtTtTtUUUUuuuuUuUuUuUuUuUuWwYyyYyYZzZzZz"
14
- str.tr(to_replace, replaced_by)
15
- end
16
-
17
- def slug(str)
18
- str.downcase.tr(' ', '_').gsub(/[^:\w-]/, '')
19
- end
20
-
21
- def thing2string(thing)
22
- thing = thing.join(" || ") if thing.is_a?(Array)
23
- thing.to_s
24
- end
25
-
26
- def read_config
27
- YAML.load_file('_config.yml')
28
- end
29
-
30
- def read_argv
31
- argv = ARGV.drop(1)
32
- argv.each { |a| task a.to_sym }
33
- argv
34
- end
35
-
36
- def padded_int(index, max_idx)
37
- index.to_s.rjust(Math.log10(max_idx).to_i + 1, "0")
38
- end
@@ -1,74 +0,0 @@
1
- include FileUtils
2
- require 'json'
3
-
4
- # for generating Lunr Index and Lunr UI files
5
- class Lunr
6
- def initialize(config)
7
- @lunr_collections = collections_to_index(config['collections'])
8
- @total_fields = total_fields(@lunr_collections)
9
- @lunr_language = config['lunr_language']
10
- @collections_dir = config['collections_dir'].nil? ? '' : config.fetch('collections_dir') + '/'
11
- end
12
-
13
- def collections_to_index(collections)
14
- collections.find_all { |c| c[1].key?('lunr_index') && c[1]['lunr_index'].key?('fields') }
15
- end
16
-
17
- def total_fields(collections)
18
- total_fields = ['pid']
19
- collections.each do |c|
20
- total_fields = total_fields.concat(c[1]['lunr_index']['fields'])
21
- total_fields << 'content' if c[1]['lunr_index']['content']
22
- end
23
- total_fields.uniq
24
- end
25
-
26
- def page_hash(page, c_fields, collection, count)
27
- yaml = YAML.load_file(page)
28
- hash = {
29
- 'lunr_id' => count,
30
- 'link' => "{{'" + yaml.fetch('permalink') + "' | relative_url }}"
31
- }
32
- c_fields.each { |f| hash[f] = rm_diacritics(thing2string(yaml[f])) }
33
- hash['content'] = rm_diacritics(clean(File.read(page))) if collection[1]['lunr_index']['content']
34
- hash
35
- end
36
-
37
- def index
38
- full_index = []
39
- count = 0
40
- # catch
41
- abort("There are no valid collections to index.".magenta) if @lunr_collections.nil?
42
- # index each lunr_collection
43
- @lunr_collections.each do |c|
44
- c_dir = @collections_dir + '_' + c[0]
45
- c_fields = c[1]['lunr_index']['fields'].uniq
46
- c_pages = Dir.glob(c_dir + '/*.md')
47
- # catch
48
- abort "There are no markdown pages in directory '#{c_dir}'".magenta if c_pages.empty?
49
- abort "There are no fields specified for #{c[0]}.".magenta if c_fields.empty?
50
- puts "Loading #{c_pages.length} pages from #{c_dir}"
51
- # index each page in collection
52
- c_pages.each do |page|
53
- full_index << page_hash(page, c_fields, c, count)
54
- count += 1
55
- end
56
- end
57
- JSON.pretty_generate(full_index)
58
- end
59
-
60
- def ui
61
- # set up index
62
- ui_string = "$.getJSON(\"{{ site.baseurl }}/js/lunr-index.json\", function(index_json) {\nwindow.index = new elasticlunr.Index;\nwindow.store = index_json;\nindex.saveDocument(false);\nindex.setRef('lunr_id');"
63
- # add fields to index
64
- @total_fields.each { |field| ui_string += "\nindex.addField('#{field}');" }
65
- # add docs
66
- ui_string += "\n// add docs\nfor (i in store){index.addDoc(store[i]);}"
67
- # gui
68
- ui_string += "\n$('input#search').on('keyup', function() {\nvar results_div = $('#results');\nvar query = $(this).val();\nvar results = index.search(query, { boolean: 'AND', expand: true });\nresults_div.empty();\nif (results.length > 10) {\nresults_div.prepend(\"<p><small>Displaying 10 of \" + results.length + \" results.</small></p>\");\n}\nfor (var r in results.slice(0, 9)) {\nvar ref = results[r].ref;\nvar item = store[ref];"
69
- # add fields as display vars
70
- @total_fields.each { |field| ui_string += "var #{field} = item.#{field};\n" }
71
- ui_string += "var result = '<div class=\"result\"><b><a href=\"' + item.link + '\">' + title + '</a></b></p></div>';\nresults_div.append(result);\n}\n});\n});"
72
- ui_string
73
- end
74
- end
data/spec/test_tasks.rb DELETED
@@ -1,44 +0,0 @@
1
- require 'yaml'
2
- require 'fileutils'
3
- require 'fake/helpers'
4
- require 'fake/site'
5
- require 'fake/data'
6
-
7
- # run + test wax:config
8
- describe 'wax_tasks' do
9
- Fake.site
10
- collection_data = Fake.data
11
- config = YAML.load_file('_config.yml')
12
- argv = collection_data.map { |col| col[0] }
13
- add_collections_to_config(argv, collection_data, config)
14
- add_lunr_data(config, collection_data)
15
-
16
- it 'accesses _config.yml and argv' do
17
- expect(config.length)
18
- expect(argv.length)
19
- end
20
-
21
- it 'generates pages' do
22
- system("bundle exec rake wax:pagemaster #{argv.join(' ')}")
23
- argv.each { |a| expect(Dir.exist?('_' + a)) }
24
- end
25
-
26
- it 'generates a lunr index' do
27
- system("bundle exec rake wax:lunr")
28
- index = File.open('js/lunr-index.json', 'r').read
29
- ui = File.open('js/lunr-ui.js', 'r').read
30
- expect(index.length > 1000)
31
- expect(ui.length > 100)
32
- end
33
-
34
- it 'generates iiif tiles and data' do
35
- images = Dir.glob('./_data/iiif/*.jpg')
36
- collection_data.each do |coll|
37
- new_dir = './_data/iiif/' + coll[0]
38
- mkdir_p(new_dir)
39
- images.each { |f| cp(File.expand_path(f), new_dir) }
40
- end
41
- rm_r(images)
42
- system("bundle exec rake wax:iiif #{argv.first}")
43
- end
44
- end