jekyll-build-ebook 0.1.1 → 0.2.0

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: 8f62eabbb712aa04efcc2d52d8d5b3e8e0aedfe04fb10549277c95951a8cc4fd
4
- data.tar.gz: 4d9079146bd7711f26c62b54e094f0ee606ec79c029f651ceae79cb510944503
3
+ metadata.gz: 24ba968d95403fed60c26ea91cbaca4f6dc8165e6813d635a7cf4b9787b3496e
4
+ data.tar.gz: 55e128d636b39639579e9e9557df04dd9303193a0d52420725e90f5e5d6e7adc
5
5
  SHA512:
6
- metadata.gz: 5d7f91f9dab141615ac2e4d44eeec31d7a7b00a32e16b98a74548beb3c96e0b9c11028573859a76c83bf6cfa7b5fa7bd97660f6133f7fb3cfd3031fc0a5b04de
7
- data.tar.gz: 1663cdabf0ea77463560b82b20536f0f1c98efbf7d23786c89916c58361b42108a0497611c6b0ae995b258c9fd9a314cb783f8144802645e269b09416fa28bd2
6
+ metadata.gz: 761ac329ef84fe8c5a74ab7bb292480942c1269ddb8c9276704b1f95d008e1cacdecb0420dc2014c34fac0b5400827ca77f01ca65a375e1477e620da5132de0a
7
+ data.tar.gz: 3094624f1c9f5b1c49eecd6864136d1db8e3f0ef9af9abd129889c4703956a3f2361b6858dd9f4613adbca037f3a1b4bae619e3e481d1956a30f00e2a6ba6e31
data/Gemfile.lock CHANGED
@@ -1,10 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- jekyll-build-ebook (0.1.1)
4
+ jekyll-build-ebook (0.2.0)
5
5
  gepub (~> 0.7)
6
6
  jekyll (~> 3.5)
7
- nokogiri (~> 1.0)
7
+ nokogiri (~> 1.8)
8
8
 
9
9
  GEM
10
10
  remote: https://rubygems.org/
@@ -23,7 +23,7 @@ Gem::Specification.new do |spec|
23
23
  spec.add_dependency 'jekyll', '~> 3.5'
24
24
 
25
25
  spec.add_dependency 'gepub', '~> 0.7'
26
- spec.add_dependency 'nokogiri', '~> 1.0'
26
+ spec.add_dependency 'nokogiri', '~> 1.8'
27
27
 
28
28
  spec.add_development_dependency 'bundler', '~> 1.16'
29
29
  spec.add_development_dependency 'meowcop'
@@ -1,9 +1,13 @@
1
1
  require 'jekyll'
2
2
 
3
+ require 'securerandom'
4
+
3
5
  require 'gepub'
4
6
  require 'nokogiri'
5
7
 
6
8
  require_relative 'jekyll/commands/build_ebook'
7
9
  require_relative 'jekyll-build-ebook/config'
10
+ require_relative 'jekyll-build-ebook/filters'
8
11
  require_relative 'jekyll-build-ebook/generator'
12
+ require_relative 'jekyll-build-ebook/hooks'
9
13
  require_relative 'jekyll-build-ebook/version'
@@ -4,67 +4,42 @@ module JekyllBuildEbook
4
4
  class Config
5
5
  DEFAULTS = {
6
6
  'ebook' => {
7
- 'destination' => '_ebook',
7
+ 'destination' => File.join(Dir.pwd, '_ebook'),
8
+ 'layout' => 'ebook',
8
9
  },
9
10
  }.freeze
10
11
 
11
- def initialize(config)
12
- @config = config
13
- end
14
-
15
- def layout
16
- ebook['layout']
17
- end
18
-
19
- def destination
20
- File.expand_path(ebook['destination'])
21
- end
22
-
23
- def file_name
24
- "#{ebook['file_name'] || title}.epub"
25
- end
26
-
27
- def identifier
28
- ebook['identifier'] || site['url'].nil? ? nil : "#{site['url']}#{site['base_url']}" || SecureRandom.uuid
29
- end
30
-
31
- def title
32
- ebook['title'] || site['title'] or raise InvalidConfigError, 'Title is required'
33
- end
34
-
35
- def language
36
- ebook['language'] || site['language'] || site['lang'] or raise InvalidConfigError, 'Language is required'
37
- end
38
-
39
- def date
40
- ebook['date']
41
- end
42
-
43
- def creator
44
- case
45
- when !ebook['creator'].nil?
46
- ebook['creator']
47
- when site['author'].is_a?(String)
48
- site['author']
49
- when site['author'].is_a?(Hash) && !site['author']['name'].nil?
50
- site['author']['name']
51
- else
52
- nil
12
+ REQUIRED_FIELDS = %w[identifier title language].freeze
13
+
14
+ attr_reader :data
15
+
16
+ def initialize(site_config)
17
+ @data = {
18
+ 'file_name' => site_config['title'],
19
+ 'identifier' => site_config['url'].nil? ? SecureRandom.uuid : "#{site_config['url']}#{site_config['base_url']}",
20
+ 'title' => site_config['title'],
21
+ 'language' => site_config['language'] || site_config['lang'],
22
+ 'creator' => case site_config['author']
23
+ when String
24
+ site_config['author']
25
+ when Hash
26
+ site_config['author']['name']
27
+ else
28
+ nil
29
+ end,
30
+ }.merge(site_config['ebook'])
31
+
32
+ REQUIRED_FIELDS.each do |field|
33
+ raise InvalidConfigError, "#{field} is required" if data[field].nil?
53
34
  end
54
35
  end
55
36
 
56
- def page_progression_direction
57
- ebook['page_progression_direction']
58
- end
59
-
60
- private
61
-
62
- def site
63
- @config
37
+ def [](key)
38
+ data[key]
64
39
  end
65
40
 
66
- def ebook
67
- @config['ebook']
41
+ def file_path
42
+ "#{File.join(data['destination'], data['file_name'])}.epub"
68
43
  end
69
44
  end
70
45
  end
@@ -0,0 +1,24 @@
1
+ module JekyllBuildEbook
2
+ module Filters
3
+ def self.register
4
+ Liquid::Template.register_filter(URLFilters)
5
+ end
6
+
7
+ module URLFilters
8
+ include Jekyll::Filters::URLFilters
9
+
10
+ def relative_url(input)
11
+ return if input.nil?
12
+ input = input.url if input.respond_to?(:url)
13
+ return input if Addressable::URI.parse(input.to_s).absolute?
14
+
15
+ page = @context.registers[:page]
16
+ page_dir = Pathname.new(page.url).dirname
17
+
18
+ Pathname.new(ensure_leading_slash(input)).relative_path_from(page_dir).to_s
19
+ end
20
+
21
+ alias_method :absolute_url, :relative_url
22
+ end
23
+ end
24
+ end
@@ -3,13 +3,12 @@ module JekyllBuildEbook
3
3
  def generate(site, book: GEPUB::Book.new)
4
4
  config = Config.new(site.config)
5
5
 
6
- book.date = site.time
7
- book.identifier = config.identifier
8
- book.title = config.title
9
- book.language = config.language
10
- book.creator = config.creator
11
- book.date = config.date || site.time
12
- book.page_progression_direction = config.page_progression_direction
6
+ book.date = config['date'] || site.time
7
+ book.identifier = config['identifier']
8
+ book.title = config['title']
9
+ book.language = config['language']
10
+ book.creator = config['creator']
11
+ book.page_progression_direction = config['page_progression_direction']
13
12
 
14
13
  site.static_files.each do |static_file|
15
14
  File.open(static_file.path) do |io|
@@ -19,27 +18,17 @@ module JekyllBuildEbook
19
18
 
20
19
  book.ordered do
21
20
  site.posts.docs.each do |post|
22
- output = render(site, post, layout: config.layout || site.layouts.key?('ebook') ? 'ebook' : 'none')
21
+ post.output = Jekyll::Renderer.new(site, post).run
23
22
 
24
23
  book
25
- .add_item("#{post.cleaned_relative_path}.xhtml")
26
- .add_content(StringIO.new(output))
24
+ .add_item(post.url)
25
+ .add_content(StringIO.new(Nokogiri::HTML(post.output).to_xhtml))
27
26
  .toc_text(post['title'])
28
27
  end
29
28
  end
30
29
 
31
- FileUtils.mkdir_p(config.destination)
32
- book.generate_epub(File.join(config.destination, config.file_name))
33
- end
34
-
35
- private
36
-
37
- def render(site, post, layout:)
38
- original_layout = post['layout']
39
- post.merge_data!('layout' => layout)
40
- output = Jekyll::Renderer.new(site, post).run
41
- post.merge_data!('layout' => original_layout)
42
- Nokogiri::HTML(output).to_xhtml
30
+ FileUtils.mkdir_p(config['destination'])
31
+ book.generate_epub("#{File.join(config['destination'], config['file_name'])}.epub")
43
32
  end
44
33
  end
45
34
  end
@@ -0,0 +1,19 @@
1
+ module JekyllBuildEbook
2
+ module Hooks
3
+ def self.register
4
+ overwrite_post_data
5
+ end
6
+
7
+ def self.overwrite_post_data
8
+ Jekyll::Hooks.register :posts, :pre_render do |post, _payload|
9
+ layout = post.site.config['ebook']['layout']
10
+ permalink = "#{post.cleaned_relative_path}.xhtml"
11
+
12
+ post.merge_data!(
13
+ 'layout' => post.site.layouts.key?(layout) ? layout : 'none',
14
+ 'permalink' => permalink,
15
+ )
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,3 +1,3 @@
1
1
  module JekyllBuildEbook
2
- VERSION = '0.1.1'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -4,28 +4,44 @@ module Jekyll
4
4
  # Create the Mercenary command for the Jekyll CLI for this Command
5
5
  def self.init_with_program(prog)
6
6
  prog.command(:'build-ebook') do |c|
7
- c.syntax 'build-ebook'
7
+ c.syntax 'build-ebook [options]'
8
8
  c.description 'Build your ebook'
9
9
  c.alias :be
10
10
 
11
+ c.option 'config', '--config CONFIG_FILE[,CONFIG_FILE2,...]', Array, 'Custom configuration file'
12
+ c.option 'destination', '-d', '--destination DESTINATION', 'The current folder will be generated into DESTINATION'
13
+ c.option 'source', '-s', '--source SOURCE', 'Custom source directory'
14
+ c.option 'future', '--future', 'Publishes posts with a future date'
15
+ c.option 'limit_posts', '--limit_posts MAX_POSTS', Integer, 'Limits the number of posts to parse and publish'
16
+ c.option 'show_drafts', '-D', '--drafts', 'Render posts in the _drafts folder'
17
+ c.option 'unpublished', '--unpublished', 'Render posts that were marked as unpublished'
18
+ c.option 'quiet', '-q', '--quiet', 'Silence output.'
19
+ c.option 'verbose', '-V', '--verbose', 'Print verbose output.'
20
+
11
21
  c.action do |_args, options|
12
22
  process(options)
13
23
  end
14
24
  end
15
25
  end
16
26
 
17
- # Build your jekyll ebook
18
- def self.process(options, generator: JekyllBuildEbook::Generator.new)
27
+ def self.process(options)
19
28
  # Adjust verbosity quickly
20
29
  Jekyll.logger.adjust_verbosity(options)
21
30
 
31
+ JekyllBuildEbook::Hooks.register
32
+ JekyllBuildEbook::Filters.register
33
+
22
34
  options = Jekyll::Utils.deep_merge_hashes(JekyllBuildEbook::Config::DEFAULTS, options)
23
- options = configuration_from_options(options)
24
- site = Jekyll::Site.new(options)
35
+ config = configuration_from_options(options)
36
+ site = Jekyll::Site.new(config)
37
+
38
+ build(site, config)
39
+ end
25
40
 
41
+ def self.build(site, config, generator: JekyllBuildEbook::Generator.new)
26
42
  t = Time.now
27
- source = options['source']
28
- destination = options['ebook']['destination']
43
+ source = config['source']
44
+ destination = config['ebook']['destination']
29
45
 
30
46
  Jekyll.logger.info 'Source:', source
31
47
  Jekyll.logger.info 'Destination:', destination
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-build-ebook
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fuji Nakahara
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.0'
47
+ version: '1.8'
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: '1.0'
54
+ version: '1.8'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: bundler
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -130,7 +130,9 @@ files:
130
130
  - jekyll-e-book.gemspec
131
131
  - lib/jekyll-build-ebook.rb
132
132
  - lib/jekyll-build-ebook/config.rb
133
+ - lib/jekyll-build-ebook/filters.rb
133
134
  - lib/jekyll-build-ebook/generator.rb
135
+ - lib/jekyll-build-ebook/hooks.rb
134
136
  - lib/jekyll-build-ebook/version.rb
135
137
  - lib/jekyll/commands/build_ebook.rb
136
138
  homepage: https://github.com/fuji-nakahara/jekyll-build-ebook