Fix Zip Export and Print View
Fix http://bug.to/issues/show/335 and http://bug.to/issues/show/334 We now bundle the uploaded files directory (and the public/ directory for the (X)HTML export) in the Zipball when exporting a Web. Also, correct the Print View to produce proper links uploaded files.
This commit is contained in:
parent
ad2fab42bd
commit
8ed5a88db0
|
@ -19,7 +19,7 @@ class ApplicationController < ActionController::Base
|
||||||
Wiki.new
|
Wiki.new
|
||||||
end
|
end
|
||||||
|
|
||||||
helper_method :xhtml_enabled?, :html_ext
|
helper_method :xhtml_enabled?, :html_ext, :darken
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
|
@ -36,6 +36,11 @@ class ApplicationController < ActionController::Base
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def darken(s)
|
||||||
|
n=s.length/3
|
||||||
|
s.scan( %r(\w{#{n},#{n}}) ).collect {|a| (a.hex * 2/3).to_s(16).rjust(n,'0')}.join
|
||||||
|
end
|
||||||
|
|
||||||
def check_authorization
|
def check_authorization
|
||||||
if in_a_web? and authorization_needed? and not authorized?
|
if in_a_web? and authorization_needed? and not authorized?
|
||||||
redirect_to :controller => 'wiki', :action => 'login', :web => @web_name
|
redirect_to :controller => 'wiki', :action => 'login', :web => @web_name
|
||||||
|
|
|
@ -74,36 +74,61 @@ class WikiController < ApplicationController
|
||||||
renderer = PageRenderer.new(page.revisions.last)
|
renderer = PageRenderer.new(page.revisions.last)
|
||||||
rendered_page = <<-EOL
|
rendered_page = <<-EOL
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg-flat.dtd" >
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg-flat.dtd" >
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<title>#{page.plain_name} in #{@web.name}</title>
|
<title>#{page.plain_name} in #{@web.name}</title>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||||
|
|
||||||
|
<script src="public/javascripts/page_helper.js" type="text/javascript"></script>
|
||||||
|
<link href="public/stylesheets/instiki.css" media="all" rel="stylesheet" type="text/css" />
|
||||||
|
<link href="public/stylesheets/syntax.css" media="all" rel="stylesheet" type="text/css" />
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
h1#pageName, .newWikiWord a, a.existingWikiWord, .newWikiWord a:hover {
|
h1#pageName, div.info, .newWikiWord a, a.existingWikiWord, .newWikiWord a:hover, [actiontype="toggle"]:hover, #TextileHelp h3 {
|
||||||
color: ##{@web ? @web.color : "393" };
|
color: ##{@web ? @web.color : "393"};
|
||||||
|
}
|
||||||
|
a:visited.existingWikiWord {
|
||||||
|
color: ##{darken(@web ? @web.color : "393")};
|
||||||
}
|
}
|
||||||
.newWikiWord { background-color: white; font-style: italic; }
|
|
||||||
#{stylesheet}
|
|
||||||
</style>
|
</style>
|
||||||
<style type="text/css">
|
|
||||||
#{@web.additional_style}
|
<style type="text/css"><!--/*--><![CDATA[/*><!--*/
|
||||||
</style>
|
#{@web ? @web.additional_style : ''}
|
||||||
</head>
|
/*]]>*/--></style>
|
||||||
<body>
|
<script src="public/javascripts/prototype.js" type="text/javascript"></script>
|
||||||
|
<script src="public/javascripts/effects.js" type="text/javascript"></script>
|
||||||
|
<script src="public/javascripts/dragdrop.js" type="text/javascript"></script>
|
||||||
|
<script src="public/javascripts/controls.js" type="text/javascript"></script>
|
||||||
|
<script src="public/javascripts/application.js" type="text/javascript"></script>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="Container">
|
||||||
|
<div id="Content">
|
||||||
<h1 id="pageName">
|
<h1 id="pageName">
|
||||||
|
#{xhtml_enabled? ? %{<span id="svg_logo"><svg version="1.1" width="100%" height="100%" viewBox='0 -1 180 198' xmlns='http://www.w3.org/2000/svg'>
|
||||||
|
<path id="svg_logo_path" fill="##{@web ? @web.color : "393"}" stroke-width='0.5' stroke='#000' d='
|
||||||
|
M170,60c4,11-1,20-12,25c-9,4-25,3-20,15c5,5,15,0,24,1c11,1,21,11,14,21c-10,15-35,6-48-1c-5-3-27-23-32-10c-1,13,15,10,22,16
|
||||||
|
c11,4,24,14,34,20c12,10,7,25-9,23c-11-1-22-9-30-16c-5-5-13-18-21-9c-2,6,2,11,5,14c9,9,22,14,22,31c-2,8-12,8-18,4c-4-3-9-8-11-13
|
||||||
|
c-3-6-5-18-12-18c-14-1-5,28-18,30c-9,2-13-9-12-16c1-14,12-24,21-31c5-4,17-13,10-20c-9-10-19,12-23,16c-7,7-17,16-31,15
|
||||||
|
c-9-1-18-9-11-17c5-7,14-4,23-6c6-1,15-8,8-15c-5-6-57,2-42-24c7-12,51,4,61,6c6,1,17,4,18-4c2-11-12-7-21-8c-21-2-49-14-49-34
|
||||||
|
c0-5,3-11,8-11C31,42,34,65,42,67c6,1,9-3,8-9C49,49,38,40,40,25c1-5,4-15,13-14c10,2,11,18,13,29c1,8,0,24,7,28c15,0,5-22,4-30
|
||||||
|
C74,23,78,7,87,1c8-4,14,1,16,9c2,11-8,21-2,30c8,2,11-6,14-12c9-14,36-18,30,5c-3,9-12,19-21,24c-6,4-22,10-23,19c-2,14,15,2,18-2
|
||||||
|
c9-9,20-18,33-22C159,52,166,54,170,60' />
|
||||||
|
</svg></span>} : ''}
|
||||||
<span class="webName">#{@web.name}</span><br />
|
<span class="webName">#{@web.name}</span><br />
|
||||||
#{page.plain_name}
|
#{page.plain_name}
|
||||||
</h1>
|
</h1>
|
||||||
#{renderer.display_content_for_export}
|
#{renderer.display_content_for_export}
|
||||||
<div class="byline">
|
<div class="byline">
|
||||||
#{page.revisions? ? "Revised" : "Created" } on #{ page.revised_at.strftime('%B %d, %Y %H:%M:%S') }
|
#{page.revisions? ? "Revised" : "Created" } on #{ page.revised_at.strftime('%B %d, %Y %H:%M:%S') }
|
||||||
by
|
by
|
||||||
#{ UrlGenerator.new(self).make_link(@web, page.author.name, @web, nil, { :mode => :export }) }
|
#{ UrlGenerator.new(self).make_link(@web, page.author.name, @web, nil, { :mode => :export }) }
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</div>
|
||||||
</html>
|
</div>
|
||||||
EOL
|
</body>
|
||||||
|
</html>
|
||||||
|
EOL
|
||||||
rendered_page
|
rendered_page
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -422,16 +447,27 @@ class WikiController < ApplicationController
|
||||||
file_path = @wiki.storage_path.join(file_prefix + timestamp + '.zip')
|
file_path = @wiki.storage_path.join(file_prefix + timestamp + '.zip')
|
||||||
tmp_path = "#{file_path}.tmp"
|
tmp_path = "#{file_path}.tmp"
|
||||||
|
|
||||||
Zip::ZipOutputStream.open(tmp_path) do |zip_out|
|
Zip::ZipFile.open(tmp_path, Zip::ZipFile::CREATE) do |zip_out|
|
||||||
@web.select.by_name.each do |page|
|
@web.select.by_name.each do |page|
|
||||||
zip_out.put_next_entry("#{CGI.escape(page.name)}.#{file_type}")
|
zip_out.get_output_stream("#{CGI.escape(page.name)}.#{file_type}") do |f|
|
||||||
zip_out.puts(block.call(page))
|
f.puts(block.call(page))
|
||||||
end
|
end
|
||||||
# add an index file, if exporting to HTML
|
end
|
||||||
|
# add an index file, and the stylesheet and javascript directories, if exporting to HTML
|
||||||
if file_type.to_s.downcase == html_ext
|
if file_type.to_s.downcase == html_ext
|
||||||
zip_out.put_next_entry "index.#{html_ext}"
|
zip_out.get_output_stream("index.#{html_ext}") do |f|
|
||||||
zip_out.puts "<html xmlns='http://www.w3.org/1999/xhtml'><head>" +
|
f.puts "<html xmlns='http://www.w3.org/1999/xhtml'><head>" +
|
||||||
"<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0;URL=HomePage.#{file_type}\"></head></html>"
|
"<meta http-equiv=\"Refresh\" content=\"0;URL=HomePage.#{html_ext}\" /></head></html>"
|
||||||
|
end
|
||||||
|
dir = Rails.root.join('public')
|
||||||
|
Dir["#{dir}/**/*"].each do |f|
|
||||||
|
zip_out.add "public#{f.sub(dir,'')}", f
|
||||||
|
end
|
||||||
|
end
|
||||||
|
files = @web.files_path
|
||||||
|
Dir.foreach(files) do |f|
|
||||||
|
next if ['.', '..'].include?(f)
|
||||||
|
zip_out.add "files/#{f}", File.join(files, f)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
FileUtils.rm_rf(Dir[@wiki.storage_path.join(file_prefix + '*.zip').to_s])
|
FileUtils.rm_rf(Dir[@wiki.storage_path.join(file_prefix + '*.zip').to_s])
|
||||||
|
|
|
@ -127,9 +127,4 @@ require 'stringsupport'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def darken(s)
|
|
||||||
n=s.length/3
|
|
||||||
s.scan( %r(\w{#{n},#{n}}) ).collect {|a| (a.hex * 2/3).to_s(16).rjust(n,'0')}.join
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
@style_additions = ".newWikiWord { background-color: white; font-style: italic; }"
|
@style_additions = ".newWikiWord { background-color: white; font-style: italic; }"
|
||||||
-%>
|
-%>
|
||||||
|
|
||||||
<%= @renderer.display_content_for_export %>
|
<%= @renderer.display_content %>
|
||||||
|
|
||||||
<div class="byline">
|
<div class="byline">
|
||||||
<%= @page.revisions? ? "Revised" : "Created" %> on <%= format_date(@page.revised_at) %>
|
<%= @page.revisions? ? "Revised" : "Created" %> on <%= format_date(@page.revised_at) %>
|
||||||
|
|
|
@ -64,7 +64,7 @@ class UrlGenerator < AbstractUrlGenerator
|
||||||
case mode
|
case mode
|
||||||
when :export
|
when :export
|
||||||
if known_file
|
if known_file
|
||||||
%{<a class="existingWikiWord" title="#{description}" href="#{CGI.escape(name)}.#{html_ext}">#{text}</a>}
|
%{<a class="existingWikiWord" title="#{description}" href="files/#{CGI.escape(name)}">#{text}</a>}
|
||||||
else
|
else
|
||||||
%{<span class="newWikiWord">#{text}</span>}
|
%{<span class="newWikiWord">#{text}</span>}
|
||||||
end
|
end
|
||||||
|
@ -119,7 +119,7 @@ class UrlGenerator < AbstractUrlGenerator
|
||||||
case mode
|
case mode
|
||||||
when :export
|
when :export
|
||||||
if known_pic
|
if known_pic
|
||||||
%{<img alt="#{text}" src="#{CGI.escape(name)}" />}
|
%{<img alt="#{text}" src="files/#{CGI.escape(name)}" />}
|
||||||
else
|
else
|
||||||
%{<img alt="#{text}" src="no image" />}
|
%{<img alt="#{text}" src="no image" />}
|
||||||
end
|
end
|
||||||
|
@ -144,7 +144,7 @@ class UrlGenerator < AbstractUrlGenerator
|
||||||
case mode
|
case mode
|
||||||
when :export
|
when :export
|
||||||
if known_media
|
if known_media
|
||||||
%{<#{media_type} src="#{CGI.escape(name)}" controls="controls">#{text}</#{media_type}>}
|
%{<#{media_type} src="files/#{CGI.escape(name)}" controls="controls">#{text}</#{media_type}>}
|
||||||
else
|
else
|
||||||
text
|
text
|
||||||
end
|
end
|
||||||
|
|
|
@ -152,7 +152,7 @@ class WikiControllerTest < ActionController::TestCase
|
||||||
zip.file.read('Oak.xhtml').gsub(/\s+/, ' ')
|
zip.file.read('Oak.xhtml').gsub(/\s+/, ' ')
|
||||||
assert_match /.*<html .*First revision of the.*HomePage.*end.*<\/html>/,
|
assert_match /.*<html .*First revision of the.*HomePage.*end.*<\/html>/,
|
||||||
zip.file.read('HomePage.xhtml').gsub(/\s+/, ' ')
|
zip.file.read('HomePage.xhtml').gsub(/\s+/, ' ')
|
||||||
assert_equal '<html xmlns=\'http://www.w3.org/1999/xhtml\'><head><META HTTP-EQUIV="Refresh" CONTENT="0;URL=HomePage.xhtml"></head></html> ', zip.file.read('index.xhtml').gsub(/\s+/, ' ')
|
assert_equal '<html xmlns=\'http://www.w3.org/1999/xhtml\'><head><meta http-equiv="Refresh" content="0;URL=HomePage.xhtml" /></head></html> ', zip.file.read('index.xhtml').gsub(/\s+/, ' ')
|
||||||
end
|
end
|
||||||
ensure
|
ensure
|
||||||
File.delete(@tempfile_path) if File.exist?(@tempfile_path)
|
File.delete(@tempfile_path) if File.exist?(@tempfile_path)
|
||||||
|
@ -183,7 +183,7 @@ class WikiControllerTest < ActionController::TestCase
|
||||||
zip.file.read('Oak.html').gsub(/\s+/, ' ')
|
zip.file.read('Oak.html').gsub(/\s+/, ' ')
|
||||||
assert_match /.*<html .*First revision of the.*HomePage.*end.*<\/html>/,
|
assert_match /.*<html .*First revision of the.*HomePage.*end.*<\/html>/,
|
||||||
zip.file.read('HomePage.html').gsub(/\s+/, ' ')
|
zip.file.read('HomePage.html').gsub(/\s+/, ' ')
|
||||||
assert_equal '<html xmlns=\'http://www.w3.org/1999/xhtml\'><head><META HTTP-EQUIV="Refresh" CONTENT="0;URL=HomePage.html"></head></html> ', zip.file.read('index.html').gsub(/\s+/, ' ')
|
assert_equal '<html xmlns=\'http://www.w3.org/1999/xhtml\'><head><meta http-equiv="Refresh" content="0;URL=HomePage.html" /></head></html> ', zip.file.read('index.html').gsub(/\s+/, ' ')
|
||||||
end
|
end
|
||||||
ensure
|
ensure
|
||||||
File.delete(@tempfile_path) if File.exist?(@tempfile_path)
|
File.delete(@tempfile_path) if File.exist?(@tempfile_path)
|
||||||
|
|
Loading…
Reference in a new issue