bookbindery 7.1.0 → 7.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
  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