lib/jazzy/docset_builder.rb in jazzy-0.14.4 vs lib/jazzy/docset_builder.rb in jazzy-0.15.0
- old
+ new
@@ -12,49 +12,55 @@
attr_reader :output_dir
attr_reader :generated_docs_dir
attr_reader :source_module
attr_reader :docset_dir
attr_reader :documents_dir
+ attr_reader :name
- def initialize(generated_docs_dir, source_module)
- @source_module = source_module
+ def initialize(generated_docs_dir)
+ @name = config.docset_title || config.module_names.first
docset_path = config.docset_path ||
- "docsets/#{source_module.name}.docset"
+ "docsets/#{safe_name}.docset"
@docset_dir = generated_docs_dir + docset_path
@generated_docs_dir = generated_docs_dir
@output_dir = docset_dir.parent
@documents_dir = docset_dir + 'Contents/Resources/Documents/'
end
- def build!
+ def build!(all_declarations)
docset_dir.rmtree if docset_dir.exist?
copy_docs
copy_icon if config.docset_icon
write_plist
- create_index
+ create_index(all_declarations)
create_archive
create_xml if config.version && config.root_url
end
private
+ def safe_name
+ name.gsub(/[^a-z0-9_\-]+/i, '_')
+ end
+
def write_plist
info_plist_path = docset_dir + 'Contents/Info.plist'
info_plist_path.open('w') do |plist|
template = Pathname(__dir__) + 'docset_builder/info_plist.mustache'
plist << Mustache.render(
template.read,
- lowercase_name: source_module.name.downcase,
- name: source_module.name,
+ lowercase_name: name.downcase,
+ lowercase_safe_name: safe_name.downcase,
+ name: name,
root_url: config.root_url,
playground_url: config.docset_playground_url,
)
end
end
def create_archive
- target = "#{source_module.name}.tgz"
+ target = "#{safe_name}.tgz"
source = docset_dir.basename.to_s
options = {
chdir: output_dir.to_s,
[1, 2] => '/dev/null', # silence all output from `tar`
}
@@ -68,31 +74,56 @@
FileUtils.mkdir_p documents_dir
FileUtils.cp_r files_to_copy, documents_dir
end
def copy_icon
- FileUtils.cp config.docset_icon, @docset_dir + 'icon.png'
+ FileUtils.cp config.docset_icon, docset_dir + 'icon.png'
end
- def create_index
+ def create_index(all_declarations)
search_index_path = docset_dir + 'Contents/Resources/docSet.dsidx'
SQLite3::Database.new(search_index_path.to_s) do |db|
db.execute('CREATE TABLE searchIndex(' \
'id INTEGER PRIMARY KEY, name TEXT, type TEXT, path TEXT);')
db.execute('CREATE UNIQUE INDEX anchor ON ' \
'searchIndex (name, type, path);')
- source_module.all_declarations.select(&:type).each do |doc|
+ all_declarations.select(&:type).each do |doc|
db.execute('INSERT OR IGNORE INTO searchIndex(name, type, path) ' \
'VALUES (?, ?, ?);', [doc.name, doc.type.dash_type, doc.filepath])
end
end
end
def create_xml
- (output_dir + "#{source_module.name}.xml").open('w') do |xml|
- url = URI.join(config.root_url, "docsets/#{source_module.name}.tgz")
+ (output_dir + "#{safe_name}.xml").open('w') do |xml|
+ url = URI.join(config.root_url, "docsets/#{safe_name}.tgz")
xml << "<entry><version>#{config.version}</version><url>#{url}" \
"</url></entry>\n"
+ end
+ end
+
+ # The web URL where the user intends to place the docset XML file.
+ def dash_url
+ return nil unless config.dash_url || config.root_url
+
+ config.dash_url ||
+ URI.join(
+ config.root_url,
+ "docsets/#{safe_name}.xml",
+ )
+ end
+
+ public
+
+ # The dash-feed:// URL that links from the Dash icon in generated
+ # docs. This is passed to the Dash app and encodes the actual web
+ # `dash_url` where the user has placed the XML file.
+ #
+ # Unfortunately for historical reasons this is *also* called the
+ # 'dash_url' where it appears in mustache templates and so on.
+ def dash_feed_url
+ dash_url&.then do |url|
+ "dash-feed://#{ERB::Util.url_encode(url.to_s)}"
end
end
end
end
end