diff --git a/app/controllers/concerns/markdown_renderable.rb b/app/controllers/concerns/markdown_renderable.rb
index 872d0fa..ed61581 100644
--- a/app/controllers/concerns/markdown_renderable.rb
+++ b/app/controllers/concerns/markdown_renderable.rb
@@ -2,11 +2,42 @@ module MarkdownRenderable
extend ActiveSupport::Concern
class_methods do
- def render_markdown(text)
+ def render_markdown(text, user = nil, project_name = nil)
return "" if text.blank?
- @markdown_renderer ||= Redcarpet::Markdown.new(
- Redcarpet::Render::HTML,
+ renderer = if user && project_name
+ Class.new(Redcarpet::Render::HTML) do
+ def initialize(user, project_name)
+ @user = user
+ @project_name = project_name
+ super()
+ end
+
+ def image(link, title, alt_text)
+ # If the link is a relative path, rewrite it
+ unless link =~ %r{^https?://}
+ link = "/projects/#{@user}/#{@project_name}/#{link}"
+ end
+ "
"
+ end
+
+ def postprocess(full_document)
+ # Only rewrite src attributes in img tags that don't already have the project path
+ full_document.gsub(/
]+src="([^"]+)"[^>]*>/) do |match|
+ src = $1
+ unless src =~ %r{^https?://} || src.start_with?("/projects/#{@user}/#{@project_name}/")
+ src = "/projects/#{@user}/#{@project_name}/#{src}"
+ end
+ match.gsub(/src="[^"]+"/, "src=\"#{src}\"")
+ end
+ end
+ end.new(user, project_name)
+ else
+ Redcarpet::Render::HTML
+ end
+
+ markdown = Redcarpet::Markdown.new(
+ renderer,
autolink: true,
tables: true,
fenced_code_blocks: true,
@@ -18,13 +49,13 @@ module MarkdownRenderable
footnotes: true
)
- @markdown_renderer.render(text).html_safe
+ markdown.render(text).html_safe
end
end
private
- def render_markdown(text)
- self.class.render_markdown(text)
+ def render_markdown(text, user = nil, project_name = nil)
+ self.class.render_markdown(text, user, project_name)
end
end
diff --git a/app/models/project.rb b/app/models/project.rb
index bdf9f9b..2955440 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -135,7 +135,7 @@ class Project
author: metadata["author"],
description: metadata["description"],
created_at: metadata["created_at"],
- content: render_markdown(markdown_content)
+ content: render_markdown(markdown_content, user, project_name)
)
end
end
diff --git a/public/projects b/public/projects
new file mode 120000
index 0000000..4daa70e
--- /dev/null
+++ b/public/projects
@@ -0,0 +1 @@
+../content/projects
\ No newline at end of file