module Metanorma
class Collection
class Sectionsplit
def build_collection
collection_setup(@base, @dir)
files = sectionsplit
input_xml = Nokogiri::XML(File.read(@input_filename,
encoding: "UTF-8"), &:huge)
collection_manifest(@base, files, input_xml, @xml, @dir).render(
{ format: %i(html), output_folder: "#{@output_filename}_collection",
coverpage: File.join(@dir, "cover.html") }.merge(@compile_opts),
)
section_split_attachments(out: "#{@output_filename}_collection")
end
def collection_setup(filename, dir)
FileUtils.mkdir_p "#{filename}_collection" if filename
FileUtils.mkdir_p dir
File.open(File.join(dir, "cover.html"), "w:UTF-8") do |f|
f.write(coll_cover)
end
end
def coll_cover
<<~COVER
{{ doctitle }}
{{ docnumber }}
COVER
end
def collection_manifest(filename, files, origxml, _presxml, dir)
File.open(File.join(dir, "#{filename}.html.yaml"), "w:UTF-8") do |f|
f.write(collectionyaml(files, origxml))
end
Metanorma::Collection.parse File.join(dir, "#{filename}.html.yaml")
end
def collectionyaml(files, xml)
ret = {
directives: ["presentation-xml", "bare-after-first"],
bibdata: {
title: {
type: "title-main", language: @lang,
content: xml.at(ns("//bibdata/title")).text
},
type: "collection",
docid: {
type: xml.at(ns("//bibdata/docidentifier/@type")).text,
id: xml.at(ns("//bibdata/docidentifier")).text,
},
},
manifest: {
level: "collection", title: "Collection",
docref: files.sort_by { |f| f[:order] }.each.map do |f|
{ fileref: f[:url], identifier: f[:title] }
end
},
}
::Metanorma::Util::recursive_string_keys(ret).to_yaml
end
def att_dir(file)
"_#{File.basename(file, '.*')}_attachments"
end
def section_split_attachments(out: nil)
attachments = att_dir(@tmp_filename)
File.directory?(attachments) or return
dir = out || File.dirname(@input_filename)
ret = File.join(dir, att_dir(@output_filename))
FileUtils.rm_rf ret
FileUtils.mv attachments, ret
File.basename(ret)
end
def section_split_cover(col, ident, _one_doc_coll)
dir = File.dirname(col.file)
collection_setup(nil, dir)
r = ::Metanorma::Collection::Renderer
.new(col, dir, output_folder: "#{ident}_collection",
format: %i(html), coverpage: File.join(dir, "cover.html"))
r.coverpage
section_split_cover1(ident, r, dir, _one_doc_coll)
end
def section_split_cover1(ident, renderer, dir, _one_doc_coll)
# filename = one_doc_coll ? "#{ident}_index.html" : "index.html"
filename = File.basename("#{ident}_index.html")
# ident can be a directory with YAML indirection
FileUtils.mv File.join(renderer.outdir, "index.html"),
File.join(dir, filename)
FileUtils.rm_rf renderer.outdir
filename
end
end
end
end