bookbindery 7.1.0 → 7.2.0

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
  SHA1:
3
- metadata.gz: 31e3c4c4ce805a8a0c47039f451d81e205a068ef
4
- data.tar.gz: edc1de563ff7fd4855ff960bc34cfb886fcb47b3
3
+ metadata.gz: 60647d1c7441e4f13ec25b2f905afa5b108d4428
4
+ data.tar.gz: 2187d4e8f5e6accd3fbb607950a053ae6e1c5308
5
5
  SHA512:
6
- metadata.gz: ebcdedfe7926b0a28a59793549d7013b3948ab8dbf3b7b16ef99d1761fcd0d7471fe51aaf42de6e14393c840997fcf0338cf0ef6507a32365f94318e375b17a9
7
- data.tar.gz: 72b74779314a6fd58913328cbf3a1590d8f0d4925bb6d86116a89fecc3f6dc2cdc1c6e2246d19e792b9d27f1356ec22db76fe804b78c311312439725af850908
6
+ metadata.gz: b625693db01e696430423e1e4889e485c1c3b84746debb95d1ea6f5b4f3464db395a40d72876c961cc75918af4c2ed1ef848e92e708b9c91020b5cf8d7b96091
7
+ data.tar.gz: a497afbb4c57e31242c4cb638a761b0f0f1f9c26a2b98e96750484a9c96b97fb4b64fa398a3b21c0a1961d1800b231f3a50ca9ea82fb87bddc9e8ba399f0b01d
@@ -2,7 +2,7 @@ require 'base64'
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'bookbindery'
5
- s.version = '7.1.0'
5
+ s.version = '7.2.0'
6
6
  s.summary = 'Markdown to Rackup application documentation generator'
7
7
  s.description = 'A command line utility to be run in Book repositories to stitch together their constituent Markdown repos into a static-HTML-serving application'
8
8
  s.authors = ['Mike Grafton', 'Lucas Marks', 'Gavin Morgan', 'Nikhil Gajwani', 'Dan Wendorf', 'Brenda Chan', 'Matthew Boedicker', 'Frank Kotsianas', 'Elena Sharma', 'Christa Hartsock']
@@ -23,7 +23,7 @@ Gem::Specification.new do |s|
23
23
  s.add_runtime_dependency 'middleman-syntax', ['~> 2.0']
24
24
  s.add_runtime_dependency 'rouge', '!= 1.9.1'
25
25
  s.add_runtime_dependency 'redcarpet', ['~> 3.2.3']
26
- s.add_runtime_dependency 'vienna', ['= 0.4.0']
26
+ s.add_runtime_dependency 'vienna', ['= 0.4.1']
27
27
  s.add_runtime_dependency 'anemone'
28
28
  s.add_runtime_dependency 'css_parser'
29
29
  s.add_runtime_dependency 'puma'
@@ -9,7 +9,7 @@ require_relative '../config/remote_yaml_credential_provider'
9
9
  require_relative '../config/validator'
10
10
  require_relative '../config/yaml_loader'
11
11
  require_relative '../dita_command_creator'
12
- require_relative '../dita_html_to_middleman_formatter'
12
+ require_relative '../dita_html_for_middleman_formatter'
13
13
  require_relative '../html_document_manipulator'
14
14
  require_relative '../ingest/cloner_factory'
15
15
  require_relative '../ingest/section_repository'
@@ -21,7 +21,6 @@ require_relative '../preprocessing/link_to_site_gen_dir'
21
21
  require_relative '../preprocessing/preprocessor'
22
22
  require_relative '../subnav/subnav_generator_factory'
23
23
  require_relative '../sheller'
24
- require_relative '../subnav/json_from_html'
25
24
  require_relative '../values/output_locations'
26
25
 
27
26
  module Bookbinder
@@ -96,8 +95,9 @@ module Bookbinder
96
95
  Postprocessing::SitemapWriter.build(logger, final_app_directory, sitemap_port),
97
96
  Preprocessing::Preprocessor.new(
98
97
  Preprocessing::DitaPreprocessor.new(
99
- DitaHtmlToMiddlemanFormatter.new(local_filesystem_accessor, dita_json_generator, html_document_manipulator),
100
98
  local_filesystem_accessor,
99
+ subnav_generator_factory,
100
+ DitaHtmlForMiddlemanFormatter.new(local_filesystem_accessor, html_document_manipulator),
101
101
  DitaCommandCreator.new(ENV['PATH_TO_DITA_OT_LIBRARY']),
102
102
  sheller
103
103
  ),
@@ -159,10 +159,6 @@ module Bookbinder
159
159
  Subnav::SubnavGeneratorFactory.new(local_filesystem_accessor, output_locations)
160
160
  end
161
161
 
162
- def json_generator
163
- Subnav::JsonFromConfig.new
164
- end
165
-
166
162
  def directory_preparer
167
163
  Commands::BindComponents::DirectoryPreparer.new(local_filesystem_accessor)
168
164
  end
@@ -175,10 +171,6 @@ module Bookbinder
175
171
  @final_app_directory ||= File.absolute_path('final_app')
176
172
  end
177
173
 
178
- def dita_json_generator
179
- Subnav::JsonFromHtml.new
180
- end
181
-
182
174
  def html_document_manipulator
183
175
  @html_document_manipulator ||= HtmlDocumentManipulator.new
184
176
  end
@@ -29,11 +29,11 @@ module Bookbinder
29
29
  end
30
30
 
31
31
  def invalid_subnav_names
32
- invalid_subnavs.map(&:name).join(", ")
32
+ invalid_subnavs.map(&:subnav_name).join(", ")
33
33
  end
34
34
 
35
35
  def missing_subnavs
36
- section_subnav_names - config.subnavs.map(&:name)
36
+ section_subnav_names - config.subnavs.map(&:subnav_name)
37
37
  end
38
38
 
39
39
  def required_subnav_keys
@@ -25,7 +25,7 @@ module Bookbinder
25
25
  end
26
26
 
27
27
  def invalid_subnav_names
28
- invalid_subnavs.map(&:name).join(', ')
28
+ invalid_subnavs.map(&:subnav_name).join(', ')
29
29
  end
30
30
 
31
31
  def required_topic_keys
@@ -50,16 +50,12 @@ module Bookbinder
50
50
 
51
51
  def dita_subnav_template(all_sections, current_section)
52
52
  subnav_sections = all_sections.select { |section| section['ditamap_location'] }
53
- if subnav_sections.empty?
54
- nil
55
- elsif subnav_sections.one?
56
- "dita_subnav"
57
- else
53
+ if subnav_sections.any?
58
54
  subnav_section = subnav_sections.include?(current_section) ? current_section : subnav_sections.first
59
55
  dest_dir = Ingest::DestinationDirectory.new(
60
56
  subnav_section.fetch('repository', {})['name'], subnav_section['directory'])
61
57
 
62
- dest_dir ? "dita_subnav_#{dest_dir}" : "dita_subnav"
58
+ "dita_subnav_#{dest_dir}"
63
59
  end
64
60
  end
65
61
  end
@@ -31,6 +31,12 @@ module Bookbinder
31
31
  repo['ref'] || 'master'
32
32
  end
33
33
 
34
+ def dependent_sections
35
+ @sections ||= (config['dependent_sections'] || []).map do |dep_section|
36
+ SectionConfig.new(dep_section)
37
+ end
38
+ end
39
+
34
40
  def preprocessor_config
35
41
  config.fetch('preprocessor_config', {})
36
42
  end
@@ -8,7 +8,7 @@ module Bookbinder
8
8
  @topics = assemble_topics || []
9
9
  end
10
10
 
11
- def name
11
+ def subnav_name
12
12
  config['name']
13
13
  end
14
14
 
@@ -1,11 +1,8 @@
1
- require_relative 'values/subnav_template'
2
-
3
1
  module Bookbinder
4
2
 
5
- class DitaHtmlToMiddlemanFormatter
6
- def initialize(file_system_accessor, subnav_formatter, html_document_manipulator)
3
+ class DitaHtmlForMiddlemanFormatter
4
+ def initialize(file_system_accessor, html_document_manipulator)
7
5
  @file_system_accessor = file_system_accessor
8
- @subnav_formatter = subnav_formatter
9
6
  @html_document_manipulator = html_document_manipulator
10
7
  end
11
8
 
@@ -29,23 +26,9 @@ module Bookbinder
29
26
  end
30
27
  end
31
28
 
32
- def format_subnav(path_to_dita_section,
33
- subnav_template_text,
34
- json_props_location,
35
- unformatted_subnav_text)
36
- formatted_json_links = subnav_formatter.get_links_as_json(unformatted_subnav_text,
37
- path_to_dita_section)
38
-
39
- nav_text = html_document_manipulator.set_attribute(document: subnav_template_text,
40
- selector: 'div.nav-content',
41
- attribute: 'data-props-location',
42
- value: json_props_location)
43
- SubnavTemplate.new(formatted_json_links, nav_text)
44
- end
45
-
46
29
  private
47
30
 
48
- attr_reader :file_system_accessor, :subnav_formatter, :html_document_manipulator
31
+ attr_reader :file_system_accessor, :html_document_manipulator
49
32
 
50
33
  def frontmatter(title)
51
34
  sanitized_title = title.gsub('"', '\"')
@@ -12,6 +12,13 @@ module Bookbinder
12
12
  doc.to_html
13
13
  end
14
14
 
15
+ def add_class(document: nil, selector: nil, classname: nil)
16
+ doc = Nokogiri::HTML.fragment(document)
17
+ node_set = doc.css(selector)
18
+ node_set.add_class(classname)
19
+ doc.to_html
20
+ end
21
+
15
22
  def read_html_in_tag(document: nil, tag: nil)
16
23
  doc = Nokogiri::HTML(document)
17
24
  doc.css(tag).inner_html
@@ -14,6 +14,17 @@ module Bookbinder
14
14
  source_ref: ref_override || section_config.repo_ref,
15
15
  destination_parent_dir: destination_dir,
16
16
  destination_dir_name: section_config.desired_directory_name)
17
+
18
+ if section_config.dependent_sections.any?
19
+ section_config.dependent_sections.map do |dependent_config|
20
+ streams[:success].puts("Gathering #{dependent_config.repo_name}")
21
+ cloner.call(source_repo_name: dependent_config.repo_name,
22
+ source_ref: ref_override || dependent_config.repo_ref,
23
+ destination_parent_dir: "#{destination_dir}/#{section_config.desired_directory_name}",
24
+ destination_dir_name: dependent_config.desired_directory_name)
25
+ end
26
+ end
27
+
17
28
  Section.new(
18
29
  working_copy.path,
19
30
  working_copy.full_name,
@@ -9,7 +9,7 @@ module Bookbinder
9
9
  new(
10
10
  Spider.new(app_dir: final_app_directory),
11
11
  ServerDirector.new(
12
- app: RackApp.new(Pathname('redirects.rb')).app,
12
+ app: RackApp.new(Pathname('redirects.rb'), auth_required: false).app,
13
13
  directory: final_app_directory,
14
14
  port: port
15
15
  )
@@ -1,4 +1,5 @@
1
1
  require_relative '../values/subnav_template'
2
+ require_relative '../../../lib/bookbinder/subnav/json_from_html_toc'
2
3
 
3
4
  module Bookbinder
4
5
  module Preprocessing
@@ -7,9 +8,10 @@ module Bookbinder
7
8
 
8
9
  ACCEPTED_IMAGE_FORMATS = %w(png jpeg jpg svg gif bmp tif tiff eps)
9
10
 
10
- def initialize(dita_formatter, local_fs_accessor, command_creator, sheller)
11
+ def initialize(fs, subnav_gen_factory, dita_formatter, command_creator, sheller)
12
+ @fs = fs
13
+ @subnav_gen_factory = subnav_gen_factory
11
14
  @dita_formatter = dita_formatter
12
- @local_fs_accessor = local_fs_accessor
13
15
  @command_creator = command_creator
14
16
  @sheller = sheller
15
17
  end
@@ -18,38 +20,44 @@ module Bookbinder
18
20
  section.subnav_template.include?('dita_subnav') if section.subnav_template
19
21
  end
20
22
 
21
- def preprocess(dita_sections, output_locations, options: [], output_streams: nil, **_)
23
+ def preprocess(sections, output_locations, options: [], output_streams: nil, **_)
24
+ @output_locations = output_locations
25
+
22
26
  dita_options = dita_flags(options)
23
- dita_sections.each do |dita_section|
24
- if dita_section.path_to_preprocessor_attribute('ditamap_location')
25
- convert_dita_files(dita_section,
27
+
28
+ sections.each do |section|
29
+ if section.path_to_preprocessor_attribute('ditamap_location')
30
+ convert_dita_files(section,
26
31
  command_creator,
27
32
  dita_options,
28
- output_locations.html_from_preprocessing_dir.join(dita_section.destination_directory),
33
+ section_html_dir(section),
29
34
  sheller,
30
35
  output_streams)
31
36
 
32
- generate_subnav(dita_section,
33
- output_locations,
34
- output_locations.source_for_site_generator.join('subnavs', '_dita_subnav_template.erb'),
35
- output_locations.subnavs_for_layout_dir)
37
+ subnav_generator.generate(section)
36
38
  end
37
39
 
38
- section_html_dir = output_locations.html_from_preprocessing_dir.join(dita_section.destination_directory)
39
- formatted_dir = output_locations.formatted_dir.join(dita_section.destination_directory)
40
- source_for_site_gen_dir = output_locations.source_for_site_generator.join(dita_section.destination_directory)
40
+ dita_formatter.format_html(section_html_dir(section), formatted_dir(section))
41
+ copy_images(section.path_to_repository, formatted_dir(section))
42
+ fs.copy_contents(formatted_dir(section), source_for_site_gen_dir(section))
43
+ end
44
+ end
41
45
 
42
- dita_formatter.format_html section_html_dir, formatted_dir
46
+ private
43
47
 
44
- copy_images(dita_section.path_to_repository, formatted_dir)
48
+ attr_reader :fs, :subnav_gen_factory, :dita_formatter, :command_creator, :sheller, :subnav_generator, :output_locations
45
49
 
46
- local_fs_accessor.copy_contents(formatted_dir, source_for_site_gen_dir)
47
- end
50
+ def section_html_dir(section)
51
+ output_locations.html_from_preprocessing_dir.join(section.destination_directory)
48
52
  end
49
53
 
50
- private
54
+ def formatted_dir(section)
55
+ output_locations.formatted_dir.join(section.destination_directory)
56
+ end
51
57
 
52
- attr_reader :dita_formatter, :local_fs_accessor, :command_creator, :sheller
58
+ def source_for_site_gen_dir(section)
59
+ output_locations.source_for_site_generator.join(section.destination_directory)
60
+ end
53
61
 
54
62
  def convert_dita_files(section, command_creator, options, section_html_dir, sheller, output_streams)
55
63
  command = command_creator.convert_to_html_command(
@@ -66,44 +74,16 @@ module Bookbinder
66
74
  end
67
75
  end
68
76
 
69
- def generate_subnav(dita_section, output_locations, dita_subnav_template_path, subnavs_dir)
70
- dita_subnav_template_text = local_fs_accessor.read(dita_subnav_template_path)
71
-
72
- tocjs_text = local_fs_accessor.read(
73
- File.join(
74
- output_locations.html_from_preprocessing_dir.join(dita_section.destination_directory),
75
- 'index.html')
76
- )
77
- json_props_location = json_props_location(dita_section.destination_directory)
78
- props_file_location = File.join(subnavs_dir, json_props_location)
79
-
80
- subnav = dita_formatter.format_subnav(dita_section.destination_directory,
81
- dita_subnav_template_text,
82
- json_props_location,
83
- tocjs_text)
84
-
85
- local_fs_accessor.write text: subnav.json_links, to: props_file_location
86
-
87
- local_fs_accessor.write text: subnav.text,
88
- to: File.join(subnavs_dir, "#{dita_section.subnav_template}.erb")
89
- end
90
-
91
77
  def copy_images(src, dest)
92
78
  image_paths = ACCEPTED_IMAGE_FORMATS.map do |format|
93
- local_fs_accessor.find_files_with_ext(format, src)
79
+ fs.find_files_with_ext(format, src)
94
80
  end.flatten
95
81
 
96
82
  image_paths.each do |image_path|
97
- local_fs_accessor.copy_including_intermediate_dirs(image_path,
98
- src,
99
- dest)
83
+ fs.copy_including_intermediate_dirs(image_path, src, dest)
100
84
  end
101
85
  end
102
86
 
103
- def json_props_location(section_dir)
104
- (["dita-subnav-props"] + Array(section_dir.to_s)).join("-") + ".json"
105
- end
106
-
107
87
  def dita_flags(opts)
108
88
  matching_flags = opts.map {|o| o[flag_value_regex("dita-flags"), 1] }
109
89
  matching_flags.compact.first
@@ -112,6 +92,10 @@ module Bookbinder
112
92
  def flag_value_regex(flag_name)
113
93
  Regexp.new(/--#{flag_name}=(.+)/)
114
94
  end
95
+
96
+ def subnav_generator
97
+ @subnav_generator ||= subnav_gen_factory.produce(Subnav::JsonFromHtmlToc.new(fs))
98
+ end
115
99
  end
116
100
  end
117
101
  end
@@ -1,5 +1,5 @@
1
1
  require_relative '../subnav/subnav_generator'
2
- require_relative '../subnav/json_from_config'
2
+ require_relative '../subnav/json_from_markdown_toc'
3
3
 
4
4
  module Bookbinder
5
5
  module Preprocessing
@@ -29,7 +29,7 @@ module Bookbinder
29
29
  private
30
30
 
31
31
  def subnav_generator
32
- @subnav_generator ||= subnav_generator_factory.produce(Subnav::JsonFromConfig.new(filesystem))
32
+ @subnav_generator ||= subnav_generator_factory.produce(Subnav::JsonFromMarkdownToc.new(filesystem))
33
33
  end
34
34
 
35
35
  attr_reader :filesystem, :subnav_generator_factory
@@ -0,0 +1,58 @@
1
+ require 'nokogiri'
2
+ require 'active_support/all'
3
+
4
+ module Bookbinder
5
+ module Subnav
6
+ class JsonFromHtmlToc
7
+ def initialize(fs)
8
+ @fs = fs
9
+ end
10
+
11
+ def get_links(section, output_locations)
12
+ @section, @output_locations = section, output_locations
13
+
14
+ doc = parse_toc_file
15
+ set_anchor_values(doc.css('a'))
16
+
17
+ {
18
+ links: gather_urls_and_texts(doc.css('body > ul'))
19
+ }.to_json
20
+ end
21
+
22
+ private
23
+
24
+ attr_reader :fs, :section, :output_locations
25
+
26
+ def parse_toc_file
27
+ html = fs.read(
28
+ File.join(
29
+ output_locations.html_from_preprocessing_dir,
30
+ section.destination_directory,
31
+ 'index.html')
32
+ )
33
+ Nokogiri::XML(html)
34
+ end
35
+
36
+ def set_anchor_values(anchors)
37
+ anchors.each do |anchor|
38
+ anchor['href'] = "/#{section.destination_directory}/#{anchor['href']}"
39
+ end
40
+ end
41
+
42
+ def gather_urls_and_texts(base_node)
43
+ top_level_li = base_node.css("> li")
44
+ top_level_li.map do |li|
45
+ anchor = li.css('a')[0]
46
+ href = anchor['href']
47
+ text = anchor.inner_text
48
+ ul = li.css('> ul')
49
+ if ul.size > 0
50
+ {url: href, text: text, nestedLinks: gather_urls_and_texts(ul)}
51
+ else
52
+ {url: href, text: text}
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -4,14 +4,14 @@ require 'redcarpet'
4
4
 
5
5
  module Bookbinder
6
6
  module Subnav
7
- class JsonFromConfig
7
+ class JsonFromMarkdownToc
8
8
  def initialize(fs)
9
9
  @fs = fs
10
10
  @renderer = Redcarpet::Markdown.new(Redcarpet::Render::HTML.new)
11
11
  end
12
12
 
13
- def get_links(subnav_config, source_for_site_gen)
14
- @source_for_site_gen = source_for_site_gen
13
+ def get_links(subnav_config, output_locations)
14
+ @source_for_site_gen = output_locations.source_for_site_generator
15
15
  @config = subnav_config
16
16
 
17
17
  { links: get_links_and_headers }.to_json
@@ -7,12 +7,12 @@ module Bookbinder
7
7
  @json_generator = json_generator
8
8
  end
9
9
 
10
- def create(subnav_config)
11
- json_links = json_generator.get_links(subnav_config, output_locations.source_for_site_generator)
10
+ def create(subnav_spec)
11
+ json_links = json_generator.get_links(subnav_spec, output_locations)
12
12
 
13
- fs.write(text: json_links, to: props_path(subnav_config.name))
13
+ fs.write(text: json_links, to: props_path(subnav_spec.subnav_name))
14
14
 
15
- filename(subnav_config.name)
15
+ filename(subnav_spec.subnav_name)
16
16
  end
17
17
 
18
18
  attr_reader :fs, :output_locations, :json_generator
@@ -7,13 +7,19 @@ module Bookbinder
7
7
  @pdf_config_creator = pdf_config_creator
8
8
  end
9
9
 
10
- def generate(subnav_config)
11
- filename = json_props_creator.create(subnav_config)
12
- template_creator.create(filename, subnav_config)
13
- pdf_config_creator.create(filename, subnav_config) if subnav_config.pdf_config
10
+ def generate(subnav_spec)
11
+ filename = json_props_creator.create(subnav_spec)
12
+ template_creator.create(filename, subnav_spec)
13
+ pdf_config_creator.create(filename, subnav_spec) if pdf?(subnav_spec)
14
14
  end
15
15
 
16
16
  attr_reader :json_props_creator, :template_creator, :pdf_config_creator
17
+
18
+ private
19
+
20
+ def pdf?(subnav_spec)
21
+ subnav_spec.respond_to?(:pdf_config) && subnav_spec.pdf_config
22
+ end
17
23
  end
18
24
  end
19
25
  end
@@ -1,3 +1,7 @@
1
+ require_relative '../../../lib/bookbinder/values/user_message'
2
+ require_relative '../../../lib/bookbinder/colorizer'
3
+ require_relative '../../../lib/bookbinder/terminal'
4
+
1
5
  module Bookbinder
2
6
  module Subnav
3
7
  class TemplateCreator
@@ -7,20 +11,28 @@ module Bookbinder
7
11
  @html_doc_manipulator = html_doc_manipulator
8
12
  end
9
13
 
10
- def create(props_filename, subnav_config)
14
+ def create(props_filename, subnav_spec)
11
15
  template_content = fs.read(template_path)
12
- nav_content = html_doc_manipulator.set_attribute(document: template_content,
16
+ nav_with_props = html_doc_manipulator.set_attribute(document: template_content,
17
+ selector: 'div.nav-content',
18
+ attribute: 'data-props-location',
19
+ value: props_filename)
20
+
21
+ nav_content = html_doc_manipulator.add_class(document: nav_with_props,
13
22
  selector: 'div.nav-content',
14
- attribute: 'data-props-location',
15
- value: props_filename)
23
+ classname: nav_type(subnav_spec))
16
24
 
17
- fs.write(text: nav_content, to: subnav_destination(subnav_config.name))
25
+ fs.write(text: nav_content, to: subnav_destination(subnav_spec.subnav_name))
18
26
  end
19
27
 
20
28
  attr_reader :fs, :output_locations, :html_doc_manipulator
21
29
 
22
30
  private
23
31
 
32
+ def nav_type(subnav_spec)
33
+ subnav_spec.subnav_name.include?('dita') ? 'deepnav-content' : 'shallownav-content'
34
+ end
35
+
24
36
  def subnavs_path
25
37
  output_locations.subnavs_for_layout_dir
26
38
  end
@@ -30,7 +42,16 @@ module Bookbinder
30
42
  end
31
43
 
32
44
  def template_path
33
- subnavs_path.join('subnav_template.erb')
45
+ deprecated_prefix = '_dita_' unless fs.file_exist?(subnavs_path.join('subnav_template.erb'))
46
+
47
+ if deprecated_prefix
48
+ Terminal.new(Colorizer.new).update(UserMessage.new(
49
+ "Use of '_dita_subnav_template.erb' is deprecated. " +
50
+ "The preferred template is 'subnav_template.erb'. Please rename your file.",
51
+ EscalationType.warn
52
+ ))
53
+ end
54
+ subnavs_path.join("#{deprecated_prefix}subnav_template.erb")
34
55
  end
35
56
 
36
57
  def subnav_destination(name)
@@ -6,7 +6,7 @@ module Bookbinder
6
6
  :full_name,
7
7
  :desired_directory_name,
8
8
  :subnav_templ,
9
- :subnav_name,
9
+ :desired_subnav_name,
10
10
  :preprocessor_config) do
11
11
  def path_to_repository
12
12
  Pathname(self[:path_to_repository].to_s)
@@ -22,8 +22,11 @@ module Bookbinder
22
22
 
23
23
  def subnav
24
24
  namespace = destination_directory.to_s.gsub('/', '_')
25
- template = subnav_template || subnav_name || 'default'
26
- {namespace => template}
25
+ {namespace => subnav_name}
26
+ end
27
+
28
+ def subnav_name
29
+ subnav_template || desired_subnav_name || 'default'
27
30
  end
28
31
 
29
32
  def path_to_preprocessor_attribute(attr)
@@ -1,13 +1,29 @@
1
1
  require 'rack/rewrite'
2
+ require 'rack/auth/basic'
2
3
  require 'vienna'
3
4
 
4
5
  module Bookbinder
5
6
  class RackApp
6
- def initialize(redirect_pathname)
7
+ def initialize(redirect_pathname, auth_required: true)
7
8
  @redirect_pathname = redirect_pathname
9
+ @auth_required = auth_required
8
10
  end
9
11
 
10
12
  def app
13
+ app = resolve_redirects
14
+
15
+ if auth_required && site_username && site_password
16
+ authorize_user(app)
17
+ else
18
+ app
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ attr_reader :redirect_pathname, :auth_required
25
+
26
+ def resolve_redirects
11
27
  if redirect_pathname.exist?
12
28
  p = redirect_pathname
13
29
  Rack::Rewrite.new(Vienna) { eval(p.read) }
@@ -16,8 +32,18 @@ module Bookbinder
16
32
  end
17
33
  end
18
34
 
19
- private
35
+ def authorize_user(app)
36
+ Rack::Auth::Basic.new(app) do |username, password|
37
+ [username, password] == [site_username, site_password]
38
+ end
39
+ end
20
40
 
21
- attr_reader :redirect_pathname
41
+ def site_username
42
+ ENV['SITE_AUTH_USERNAME']
43
+ end
44
+
45
+ def site_password
46
+ ENV['SITE_AUTH_PASSWORD']
47
+ end
22
48
  end
23
49
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bookbindery
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.1.0
4
+ version: 7.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Grafton
@@ -17,118 +17,118 @@ authors:
17
17
  autorequire:
18
18
  bindir: install_bin
19
19
  cert_chain: []
20
- date: 2015-10-19 00:00:00.000000000 Z
20
+ date: 2015-10-23 00:00:00.000000000 Z
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
23
23
  name: fog-aws
24
24
  requirement: !ruby/object:Gem::Requirement
25
25
  requirements:
26
- - - ~>
26
+ - - "~>"
27
27
  - !ruby/object:Gem::Version
28
28
  version: 0.7.1
29
29
  type: :runtime
30
30
  prerelease: false
31
31
  version_requirements: !ruby/object:Gem::Requirement
32
32
  requirements:
33
- - - ~>
33
+ - - "~>"
34
34
  - !ruby/object:Gem::Version
35
35
  version: 0.7.1
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: ansi
38
38
  requirement: !ruby/object:Gem::Requirement
39
39
  requirements:
40
- - - ~>
40
+ - - "~>"
41
41
  - !ruby/object:Gem::Version
42
42
  version: '1.4'
43
43
  type: :runtime
44
44
  prerelease: false
45
45
  version_requirements: !ruby/object:Gem::Requirement
46
46
  requirements:
47
- - - ~>
47
+ - - "~>"
48
48
  - !ruby/object:Gem::Version
49
49
  version: '1.4'
50
50
  - !ruby/object:Gem::Dependency
51
51
  name: unf
52
52
  requirement: !ruby/object:Gem::Requirement
53
53
  requirements:
54
- - - ~>
54
+ - - "~>"
55
55
  - !ruby/object:Gem::Version
56
56
  version: '0.1'
57
57
  type: :runtime
58
58
  prerelease: false
59
59
  version_requirements: !ruby/object:Gem::Requirement
60
60
  requirements:
61
- - - ~>
61
+ - - "~>"
62
62
  - !ruby/object:Gem::Version
63
63
  version: '0.1'
64
64
  - !ruby/object:Gem::Dependency
65
65
  name: middleman
66
66
  requirement: !ruby/object:Gem::Requirement
67
67
  requirements:
68
- - - ~>
68
+ - - "~>"
69
69
  - !ruby/object:Gem::Version
70
70
  version: 3.4.0
71
71
  type: :runtime
72
72
  prerelease: false
73
73
  version_requirements: !ruby/object:Gem::Requirement
74
74
  requirements:
75
- - - ~>
75
+ - - "~>"
76
76
  - !ruby/object:Gem::Version
77
77
  version: 3.4.0
78
78
  - !ruby/object:Gem::Dependency
79
79
  name: middleman-livereload
80
80
  requirement: !ruby/object:Gem::Requirement
81
81
  requirements:
82
- - - ~>
82
+ - - "~>"
83
83
  - !ruby/object:Gem::Version
84
84
  version: 3.4.3
85
85
  type: :runtime
86
86
  prerelease: false
87
87
  version_requirements: !ruby/object:Gem::Requirement
88
88
  requirements:
89
- - - ~>
89
+ - - "~>"
90
90
  - !ruby/object:Gem::Version
91
91
  version: 3.4.3
92
92
  - !ruby/object:Gem::Dependency
93
93
  name: middleman-syntax
94
94
  requirement: !ruby/object:Gem::Requirement
95
95
  requirements:
96
- - - ~>
96
+ - - "~>"
97
97
  - !ruby/object:Gem::Version
98
98
  version: '2.0'
99
99
  type: :runtime
100
100
  prerelease: false
101
101
  version_requirements: !ruby/object:Gem::Requirement
102
102
  requirements:
103
- - - ~>
103
+ - - "~>"
104
104
  - !ruby/object:Gem::Version
105
105
  version: '2.0'
106
106
  - !ruby/object:Gem::Dependency
107
107
  name: rouge
108
108
  requirement: !ruby/object:Gem::Requirement
109
109
  requirements:
110
- - - '!='
110
+ - - "!="
111
111
  - !ruby/object:Gem::Version
112
112
  version: 1.9.1
113
113
  type: :runtime
114
114
  prerelease: false
115
115
  version_requirements: !ruby/object:Gem::Requirement
116
116
  requirements:
117
- - - '!='
117
+ - - "!="
118
118
  - !ruby/object:Gem::Version
119
119
  version: 1.9.1
120
120
  - !ruby/object:Gem::Dependency
121
121
  name: redcarpet
122
122
  requirement: !ruby/object:Gem::Requirement
123
123
  requirements:
124
- - - ~>
124
+ - - "~>"
125
125
  - !ruby/object:Gem::Version
126
126
  version: 3.2.3
127
127
  type: :runtime
128
128
  prerelease: false
129
129
  version_requirements: !ruby/object:Gem::Requirement
130
130
  requirements:
131
- - - ~>
131
+ - - "~>"
132
132
  - !ruby/object:Gem::Version
133
133
  version: 3.2.3
134
134
  - !ruby/object:Gem::Dependency
@@ -137,152 +137,152 @@ dependencies:
137
137
  requirements:
138
138
  - - '='
139
139
  - !ruby/object:Gem::Version
140
- version: 0.4.0
140
+ version: 0.4.1
141
141
  type: :runtime
142
142
  prerelease: false
143
143
  version_requirements: !ruby/object:Gem::Requirement
144
144
  requirements:
145
145
  - - '='
146
146
  - !ruby/object:Gem::Version
147
- version: 0.4.0
147
+ version: 0.4.1
148
148
  - !ruby/object:Gem::Dependency
149
149
  name: anemone
150
150
  requirement: !ruby/object:Gem::Requirement
151
151
  requirements:
152
- - - '>='
152
+ - - ">="
153
153
  - !ruby/object:Gem::Version
154
154
  version: '0'
155
155
  type: :runtime
156
156
  prerelease: false
157
157
  version_requirements: !ruby/object:Gem::Requirement
158
158
  requirements:
159
- - - '>='
159
+ - - ">="
160
160
  - !ruby/object:Gem::Version
161
161
  version: '0'
162
162
  - !ruby/object:Gem::Dependency
163
163
  name: css_parser
164
164
  requirement: !ruby/object:Gem::Requirement
165
165
  requirements:
166
- - - '>='
166
+ - - ">="
167
167
  - !ruby/object:Gem::Version
168
168
  version: '0'
169
169
  type: :runtime
170
170
  prerelease: false
171
171
  version_requirements: !ruby/object:Gem::Requirement
172
172
  requirements:
173
- - - '>='
173
+ - - ">="
174
174
  - !ruby/object:Gem::Version
175
175
  version: '0'
176
176
  - !ruby/object:Gem::Dependency
177
177
  name: puma
178
178
  requirement: !ruby/object:Gem::Requirement
179
179
  requirements:
180
- - - '>='
180
+ - - ">="
181
181
  - !ruby/object:Gem::Version
182
182
  version: '0'
183
183
  type: :runtime
184
184
  prerelease: false
185
185
  version_requirements: !ruby/object:Gem::Requirement
186
186
  requirements:
187
- - - '>='
187
+ - - ">="
188
188
  - !ruby/object:Gem::Version
189
189
  version: '0'
190
190
  - !ruby/object:Gem::Dependency
191
191
  name: rack-rewrite
192
192
  requirement: !ruby/object:Gem::Requirement
193
193
  requirements:
194
- - - '>='
194
+ - - ">="
195
195
  - !ruby/object:Gem::Version
196
196
  version: '0'
197
197
  type: :runtime
198
198
  prerelease: false
199
199
  version_requirements: !ruby/object:Gem::Requirement
200
200
  requirements:
201
- - - '>='
201
+ - - ">="
202
202
  - !ruby/object:Gem::Version
203
203
  version: '0'
204
204
  - !ruby/object:Gem::Dependency
205
205
  name: therubyracer
206
206
  requirement: !ruby/object:Gem::Requirement
207
207
  requirements:
208
- - - '>='
208
+ - - ">="
209
209
  - !ruby/object:Gem::Version
210
210
  version: '0'
211
211
  type: :runtime
212
212
  prerelease: false
213
213
  version_requirements: !ruby/object:Gem::Requirement
214
214
  requirements:
215
- - - '>='
215
+ - - ">="
216
216
  - !ruby/object:Gem::Version
217
217
  version: '0'
218
218
  - !ruby/object:Gem::Dependency
219
219
  name: git
220
220
  requirement: !ruby/object:Gem::Requirement
221
221
  requirements:
222
- - - ~>
222
+ - - "~>"
223
223
  - !ruby/object:Gem::Version
224
224
  version: 1.2.8
225
225
  type: :runtime
226
226
  prerelease: false
227
227
  version_requirements: !ruby/object:Gem::Requirement
228
228
  requirements:
229
- - - ~>
229
+ - - "~>"
230
230
  - !ruby/object:Gem::Version
231
231
  version: 1.2.8
232
232
  - !ruby/object:Gem::Dependency
233
233
  name: license_finder
234
234
  requirement: !ruby/object:Gem::Requirement
235
235
  requirements:
236
- - - '>='
236
+ - - ">="
237
237
  - !ruby/object:Gem::Version
238
238
  version: '0'
239
239
  type: :development
240
240
  prerelease: false
241
241
  version_requirements: !ruby/object:Gem::Requirement
242
242
  requirements:
243
- - - '>='
243
+ - - ">="
244
244
  - !ruby/object:Gem::Version
245
245
  version: '0'
246
246
  - !ruby/object:Gem::Dependency
247
247
  name: pry-byebug
248
248
  requirement: !ruby/object:Gem::Requirement
249
249
  requirements:
250
- - - '>='
250
+ - - ">="
251
251
  - !ruby/object:Gem::Version
252
252
  version: '0'
253
253
  type: :development
254
254
  prerelease: false
255
255
  version_requirements: !ruby/object:Gem::Requirement
256
256
  requirements:
257
- - - '>='
257
+ - - ">="
258
258
  - !ruby/object:Gem::Version
259
259
  version: '0'
260
260
  - !ruby/object:Gem::Dependency
261
261
  name: rake
262
262
  requirement: !ruby/object:Gem::Requirement
263
263
  requirements:
264
- - - '>='
264
+ - - ">="
265
265
  - !ruby/object:Gem::Version
266
266
  version: '0'
267
267
  type: :development
268
268
  prerelease: false
269
269
  version_requirements: !ruby/object:Gem::Requirement
270
270
  requirements:
271
- - - '>='
271
+ - - ">="
272
272
  - !ruby/object:Gem::Version
273
273
  version: '0'
274
274
  - !ruby/object:Gem::Dependency
275
275
  name: rspec
276
276
  requirement: !ruby/object:Gem::Requirement
277
277
  requirements:
278
- - - '>='
278
+ - - ">="
279
279
  - !ruby/object:Gem::Version
280
280
  version: '0'
281
281
  type: :development
282
282
  prerelease: false
283
283
  version_requirements: !ruby/object:Gem::Requirement
284
284
  requirements:
285
- - - '>='
285
+ - - ">="
286
286
  - !ruby/object:Gem::Version
287
287
  version: '0'
288
288
  description: A command line utility to be run in Book repositories to stitch together
@@ -347,7 +347,7 @@ files:
347
347
  - lib/bookbinder/deprecated_logger.rb
348
348
  - lib/bookbinder/directory_helpers.rb
349
349
  - lib/bookbinder/dita_command_creator.rb
350
- - lib/bookbinder/dita_html_to_middleman_formatter.rb
350
+ - lib/bookbinder/dita_html_for_middleman_formatter.rb
351
351
  - lib/bookbinder/errors/cli_error.rb
352
352
  - lib/bookbinder/errors/programmer_mistake.rb
353
353
  - lib/bookbinder/html_document_manipulator.rb
@@ -375,8 +375,8 @@ files:
375
375
  - lib/bookbinder/spider.rb
376
376
  - lib/bookbinder/stabilimentum.rb
377
377
  - lib/bookbinder/streams/colorized_stream.rb
378
- - lib/bookbinder/subnav/json_from_config.rb
379
- - lib/bookbinder/subnav/json_from_html.rb
378
+ - lib/bookbinder/subnav/json_from_html_toc.rb
379
+ - lib/bookbinder/subnav/json_from_markdown_toc.rb
380
380
  - lib/bookbinder/subnav/json_props_creator.rb
381
381
  - lib/bookbinder/subnav/pdf_config_creator.rb
382
382
  - lib/bookbinder/subnav/subnav_generator.rb
@@ -412,12 +412,12 @@ require_paths:
412
412
  - lib
413
413
  required_ruby_version: !ruby/object:Gem::Requirement
414
414
  requirements:
415
- - - '>='
415
+ - - ">="
416
416
  - !ruby/object:Gem::Version
417
417
  version: '2.0'
418
418
  required_rubygems_version: !ruby/object:Gem::Requirement
419
419
  requirements:
420
- - - '>='
420
+ - - ">="
421
421
  - !ruby/object:Gem::Version
422
422
  version: '0'
423
423
  requirements: []
@@ -1,38 +0,0 @@
1
- require 'nokogiri'
2
- require 'active_support/all'
3
-
4
- module Bookbinder
5
- module Subnav
6
- class JsonFromHtml
7
- def get_links_as_json(raw_subnav_text, base_dirname)
8
- doc = Nokogiri::XML(raw_subnav_text)
9
-
10
- all_anchors = doc.css('a')
11
- all_anchors.each do |anchor|
12
- anchor['href'] = "/#{base_dirname}/#{anchor['href']}"
13
- end
14
-
15
- {
16
- links: gather_urls_and_texts(doc.css('body > ul'))
17
- }.to_json
18
- end
19
-
20
- private
21
-
22
- def gather_urls_and_texts(base_node)
23
- top_level_li = base_node.css("> li")
24
- top_level_li.map do |li|
25
- anchor = li.css('a')[0]
26
- href = anchor['href']
27
- text = anchor.inner_text
28
- ul = li.css('> ul')
29
- if ul.size > 0
30
- {url: href, text: text, nestedLinks: gather_urls_and_texts(ul)}
31
- else
32
- {url: href, text: text}
33
- end
34
- end
35
- end
36
- end
37
- end
38
- end