mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2024-11-11 10:06:53 +08:00
6b79f32e52
* Fix asset V2 export/import [SCI-6936] * Fix import of legacy eln step description images [SCI-6937]
137 lines
4.3 KiB
Ruby
137 lines
4.3 KiB
Ruby
require 'zip'
|
|
|
|
module ProtocolsExporterV2
|
|
include ProtocolsExporter
|
|
|
|
private
|
|
|
|
def generate_envelope_xml(protocols)
|
|
envelope_xml = "<envelope xmlns=\"http://www.scinote.net\" " \
|
|
"version=\"1.1\">\n"
|
|
protocols.each do |protocol|
|
|
protocol_name = get_protocol_name(protocol)
|
|
envelope_xml << "<protocol id=\"#{protocol.id}\" " \
|
|
"guid=\"#{get_guid(protocol.id)}\">#{protocol_name}" \
|
|
"</protocol>\n"
|
|
end
|
|
envelope_xml << "</envelope>\n"
|
|
envelope_xml
|
|
end
|
|
|
|
def generate_protocol_xml(protocol)
|
|
protocol_name = get_protocol_name(protocol)
|
|
|
|
protocol_xml =
|
|
"<eln xmlns=\"http://www.scinote.net\" version=\"1.1\">\n" \
|
|
"<protocol id=\"#{protocol.id}\" guid=\"#{get_guid(protocol.id)}\">\n" \
|
|
"<name>#{protocol_name}</name>\n" \
|
|
"<authors>#{protocol.authors}</authors>\n" \
|
|
"<description>" \
|
|
"<!--[CDATA[ #{Nokogiri::HTML::DocumentFragment.parse(protocol.description)} ]]-->" \
|
|
"</description>\n"
|
|
|
|
if tiny_mce_asset_present?(protocol) && protocol.description
|
|
protocol_xml << get_tiny_mce_assets(protocol.description)
|
|
end
|
|
|
|
protocol_xml << "<created_at>#{protocol.created_at.as_json}</created_at>\n"
|
|
protocol_xml << "<updated_at>#{protocol.updated_at.as_json}</updated_at>\n"
|
|
|
|
# Steps
|
|
if protocol.steps.any?
|
|
protocol_xml <<
|
|
"<steps>\n" \
|
|
"#{protocol.steps.order(:position).map { |s| step_xml(s) }.join}" \
|
|
"</steps>\n"
|
|
end
|
|
|
|
protocol_xml << "</protocol>\n"
|
|
protocol_xml << '</eln>'
|
|
protocol_xml
|
|
end
|
|
|
|
def step_xml(step)
|
|
step_guid = get_guid(step.id)
|
|
xml = "<step id=\"#{step.id}\" guid=\"#{step_guid}\" position=\"#{step.position}\">\n" \
|
|
"<name>#{step.name}</name>\n"
|
|
|
|
# Assets
|
|
xml << "<assets>\n#{step.assets.map { |a| asset_xml(a) }.join}</assets>\n" if step.assets.any?
|
|
|
|
if step.step_orderable_elements.any?
|
|
xml << "<stepElements>\n"
|
|
step.step_orderable_elements.find_each do |step_orderable_element|
|
|
element = step_orderable_element.orderable
|
|
element_guid = get_guid(element.id)
|
|
xml << "<stepElement type=\"#{step_orderable_element.orderable_type}\" guid=\"#{element_guid}\" " \
|
|
"position=\"#{step_orderable_element.position}\">"
|
|
|
|
case element
|
|
when StepText
|
|
xml << step_text_xml(element)
|
|
when StepTable
|
|
xml << table_xml(element.table)
|
|
when Checklist
|
|
xml << checklist_xml(element)
|
|
end
|
|
|
|
xml << "</stepElement>\n"
|
|
end
|
|
xml << "</stepElements>\n"
|
|
end
|
|
|
|
xml << '</step>'
|
|
|
|
xml
|
|
end
|
|
|
|
def step_text_xml(step_text)
|
|
xml = "<stepText id=\"#{step_text.id}\" guid=\"#{get_guid(step_text.id)}\">\n" \
|
|
"<contents>\n" \
|
|
"<!--[CDATA[ #{Nokogiri::HTML::DocumentFragment.parse(step_text.text)} ]]-->"\
|
|
"</contents>\n"
|
|
|
|
xml << get_tiny_mce_assets(step_text.text)
|
|
|
|
xml << "</stepText>\n"
|
|
end
|
|
|
|
def table_xml(table)
|
|
"<elnTable id=\"#{table.id}\" guid=\"#{get_guid(table.id)}\">\n" \
|
|
"<name>#{table.name}</name>\n" \
|
|
"<contents>#{table.contents.unpack1('H*')}</contents>\n" \
|
|
"</elnTable>\n"
|
|
end
|
|
|
|
def checklist_xml(checklist)
|
|
xml = "<checklist id=\"#{checklist.id}\" guid=\"#{get_guid(checklist.id)}\">\n" \
|
|
"<name>#{checklist.name}</name>\n"
|
|
|
|
if checklist.checklist_items.any?
|
|
xml << "<items>\n#{checklist.checklist_items.map { |ci| checklist_item_xml(ci) }.join}</items>\n"
|
|
end
|
|
|
|
xml << "</checklist>\n"
|
|
|
|
xml
|
|
end
|
|
|
|
def checklist_item_xml(checklist_item)
|
|
"<item id=\"#{checklist_item.id}\" " \
|
|
"guid=\"#{get_guid(checklist_item.id)}\" " \
|
|
"position=\"#{checklist_item.position}\">\n" \
|
|
"<text>#{checklist_item.text}</text>\n" \
|
|
"</item>\n" \
|
|
end
|
|
|
|
def asset_xml(asset)
|
|
asset_guid = get_guid(asset.id)
|
|
asset_file_name = "#{asset_guid}#{File.extname(asset.file_name)}"
|
|
"#{asset_guid}#{File.extname(asset.file_name)}" \
|
|
"<asset id=\"#{asset.id}\" guid=\"#{asset_guid}\" fileRef=\"#{asset_file_name}\">\n" \
|
|
"<fileName>#{asset.file_name}</fileName>\n" \
|
|
"<fileType>#{asset.content_type}</fileType>\n" \
|
|
"<fileMetadata><!--[CDATA[ #{asset.file.metadata.to_json} ]]--></fileMetadata>\n" \
|
|
"</asset>\n"
|
|
end
|
|
end
|