wax_tasks 0.0.46 → 0.0.47

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.
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