Files
writebook/app/models/demo_content.rb

88 lines
2.7 KiB
Ruby

class DemoContent
class << self
def create_manual(user)
book = create_book(user)
load_markdown_pages(book)
end
private
def create_book(user)
Book.create(title: "The Writebook Manual", author: "37signals", everyone_access: true).tap do |book|
with_attachment("writebook-manual.jpg") { |attachment| book.cover.attach(attachment) }
book.update_access(readers: [], editors: [ user.id ])
end
end
def load_markdown_pages(book)
pages = {}
Dir.glob(Rails.root.join("app/assets/markdown/demo/*.md")).each do |fname|
front_matter = FrontMatterParser::Parser.parse_file(fname)
if front_matter["class"] == "Section"
load_section(book, front_matter)
else
page = load_markdown_page(book, front_matter)
attach_images(page)
pages[page.leaf.slug] = page
end
end
book.leaves.pages.each { |leaf| localize_ref_links(leaf.page, pages) }
end
def load_markdown_page(book, front_matter)
book.press(Page.new(body: front_matter.content), title: front_matter["title"]).page
end
def load_section(book, front_matter)
book.press Section.new(body: front_matter.content, theme: front_matter["theme"]), title: front_matter["title"]
end
def attach_images(page)
re = %r{
\/u\/ # leading portion of path
(\S+-\w+\.\w+) # filename including slug and extension
}x
body = page.body.content.gsub(re) do |match|
with_attachment($1) { |attachment| page.body.uploads.attach(attachment) }
attachment = page.body.uploads.attachments.last
attachment.analyze
"/u/" + attachment.slug
end
page.update!(body: body)
end
def localize_ref_links(page, pages)
re = %r{
(\[.+\]) # link title
\( # opening paren
\/\d+\/[\w-]+\/\d+\/ # leading portion of path
([\w-]+) # leaf slug
}x
body = page.body.content.gsub(re) do |match|
link_title, leaf_slug, anchor = $1, $2, $3
linked_page = pages[leaf_slug]
raise "Invalid reference link: #{page_title}" unless linked_page.present?
url = Rails.application.routes.url_helpers.leafable_slug_path(linked_page.leaf, anchor: anchor, only_path: true)
"#{link_title}(#{url}"
end
page.update!(body: body)
end
def with_attachment(filename)
File.open(Rails.root.join("app/assets/images/demo/#{filename}")) do |file|
yield io: file, filename: filename
end
end
end
end