diff --git a/app/controllers/export_controller.rb b/app/controllers/export_controller.rb new file mode 100644 index 000000000..adf00b7c2 --- /dev/null +++ b/app/controllers/export_controller.rb @@ -0,0 +1,124 @@ +class ExportController < ApplicationController + + def index + end + + # Formats + + def universes_csv + send_data to_csv(current_user.universes), filename: "universes-#{Date.today}.csv" + end + + def characters_csv + send_data to_csv(current_user.characters), filename: "characters-#{Date.today}.csv" + end + + def locations_csv + send_data to_csv(current_user.locations), filename: "locations-#{Date.today}.csv" + end + + def items_csv + send_data to_csv(current_user.items), filename: "items-#{Date.today}.csv" + end + + def outline + send_data content_to_outline, filename: "notebook-#{Date.today}.txt" + end + + def notebook_json + json_dump = current_user.content.map { |_, content| to_json(content) }.to_json + send_data json_dump, filename: "notebook-#{Date.today}.json" + end + + def pdf + end + + def html + end + + def xml + end + + def scrivener + end + + private + + def to_csv ar_relation + ar_class = ar_relation.build.class + attributes = ar_class.attribute_categories.flat_map { |k, v| v[:attributes] } + + CSV.generate(headers: true) do |csv| + csv << attributes + + ar_relation.each do |content| + csv << attributes.map do |attr| + value = content.send(attr) + + if value.is_a?(ActiveRecord::Associations::CollectionProxy) + value = value.map(&:name).to_sentence + elsif attr.end_with?('_id') && value.present? + value = Universe.find(value.to_i).name + end + + value + end + end + end + end + + def to_json ar_relation + ar_class = ar_relation.build.class + attributes = ar_class.attribute_categories.flat_map { |k, v| v[:attributes] } + + ar_relation.map do |content| + content_json = {} + + attributes.each do |attr| + value = content.send(attr) + + if value.is_a?(ActiveRecord::Associations::CollectionProxy) + value = value.map(&:name).to_sentence + elsif attr.end_with?('_id') && value.present? + value = Universe.find(value.to_i).name + end + + content_json[attr] = value + end + + content_json + end + end + + def content_to_outline + content_types = %w(universes characters locations items) + + text = "" + content_types.each do |content_type| + ar_class = current_user.send(content_type).build.class + attributes = ar_class.attribute_categories.flat_map { |k, v| v[:attributes] } + + text << "\n#{content_type.upcase}\n" + current_user.send(content_type).each do |content| + text << " #{content.name}\n" + + attributes.each do |attr| + value = content.send(attr) + next if value.nil? || value.blank? || (value.respond_to?(:empty) && value.empty?) + + if value.is_a?(ActiveRecord::Associations::CollectionProxy) + value = value.map(&:name).to_sentence + elsif attr.end_with?('_id') && value.present? + value = Universe.find(value.to_i).name + end + + text << " #{attr}: #{value.split("\n").join("\n ")}\n" + end + + text << "\n" + end + end + + text + end +end diff --git a/app/helpers/export_helper.rb b/app/helpers/export_helper.rb new file mode 100644 index 000000000..34acf5f1a --- /dev/null +++ b/app/helpers/export_helper.rb @@ -0,0 +1,2 @@ +module ExportHelper +end diff --git a/app/views/export/csv.html.erb b/app/views/export/csv.html.erb new file mode 100644 index 000000000..b82f29024 --- /dev/null +++ b/app/views/export/csv.html.erb @@ -0,0 +1,2 @@ +
Find me in app/views/export/csv.html.erb
diff --git a/app/views/export/html.html.erb b/app/views/export/html.html.erb new file mode 100644 index 000000000..5f9f00d5b --- /dev/null +++ b/app/views/export/html.html.erb @@ -0,0 +1,2 @@ +Find me in app/views/export/html.html.erb
diff --git a/app/views/export/index.html.erb b/app/views/export/index.html.erb new file mode 100644 index 000000000..f78b2e59d --- /dev/null +++ b/app/views/export/index.html.erb @@ -0,0 +1,35 @@ +Find me in app/views/export/json.html.erb
diff --git a/app/views/export/outline.html.erb b/app/views/export/outline.html.erb new file mode 100644 index 000000000..5e9586d8a --- /dev/null +++ b/app/views/export/outline.html.erb @@ -0,0 +1,2 @@ +Find me in app/views/export/outline.html.erb
diff --git a/app/views/export/pdf.html.erb b/app/views/export/pdf.html.erb new file mode 100644 index 000000000..19e3f07d3 --- /dev/null +++ b/app/views/export/pdf.html.erb @@ -0,0 +1,2 @@ +Find me in app/views/export/pdf.html.erb
diff --git a/app/views/export/scrivener.html.erb b/app/views/export/scrivener.html.erb new file mode 100644 index 000000000..bccdea041 --- /dev/null +++ b/app/views/export/scrivener.html.erb @@ -0,0 +1,2 @@ +Find me in app/views/export/scrivener.html.erb
diff --git a/app/views/export/xml.html.erb b/app/views/export/xml.html.erb new file mode 100644 index 000000000..d70d803d7 --- /dev/null +++ b/app/views/export/xml.html.erb @@ -0,0 +1,2 @@ +Find me in app/views/export/xml.html.erb
diff --git a/app/views/layouts/_navbar.html.erb b/app/views/layouts/_navbar.html.erb index 5c0f5ff06..4f427522d 100644 --- a/app/views/layouts/_navbar.html.erb +++ b/app/views/layouts/_navbar.html.erb @@ -6,6 +6,7 @@