88 lines
2.7 KiB
Ruby
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
|