Defect #40937
openBroken links in exported wiki pages when using child_pages macro
0%
Description
Problem¶
- Table of contents
- Problem
- Reason
- Solution (proposal)
Exporting wiki pages has broken links in pdf and html format when macro `child_pages` is in use.
PDF Export¶
- Exporting to pdf gives nonexecutable links for child pages. It does not matter if a single page will be exported or all wiki pages at once. A wiki link in contrast (`First-child-page`) is integrated as absolute url to the wiki page in the Redmine instance.
HTML Export¶
- Exporting a single wiki page to html gives relative URLs as child pages links such that `file:///projects/ecookbook/wiki/First-child-page`. In contrast a wiki link to the same page written like so `First-child-page` gives a link to the page as if it would be stored local too. The link looks like `file://First-child-page.html`.
- Exporting all wiki pages into a single html document behaves as expected. All links are anchors in the document. The user can jump to whatever section she likes. Even the wikis table of content is exported. This is perfect.
How to reproduce?¶
You can reproduce the behavior by importing the attached patch files and trying the exports as follows:
- PDF: * single page (main page is enough) * all pages (got to index by title page first and export then)
- HTML: * single page (both main page and child page) * all pages (got to index by title page first and export then)
Reason¶
The reason for these broken links is the definition of the href
variable in the method ApplicationHelper#render_page_hierarchy
.
This is the method with Redmine trunk (https://svn.redmine.org/redmine/trunk@22902):
def render_page_hierarchy(pages, node=nil, options={})
content = +''
if pages[node]
content << "<ul class=\"pages-hierarchy\">\n"
pages[node].each do |page|
content << "<li>"
if controller.controller_name == 'wiki' && controller.action_name == 'export'
href = "##{page.title}" # <-- problematic definition
else
href = {:controller => 'wiki', :action => 'show',
:project_id => page.project, :id => page.title, :version => nil} # <-- problematic definition
end
content <<
link_to(
h(page.pretty_title),
href,
:title => (if options[:timestamp] && page.updated_on
l(:label_updated_time, distance_of_time_in_words(Time.now, page.updated_on))
else
nil
end)
)
content << "\n" + render_page_hierarchy(pages, page.id, options) if pages[page.id]
content << "</li>\n"
end
content << "</ul>\n"
end
content.html_safe
end
Solution (proposal)¶
PDF Export¶
Anchor links in a text transformed to pdf by the gem rbpdf do not align with pdf bookmarks. Therefore, I would like to put forward the proposal to integrate child pages links the same way as wiki links, hence, as absolute URL to the Redmine instance wiki page.
This should apply to both single wiki page export and all wiki page export to pdf.
HTML Export¶
Exporting to a single html page should integrate the link as local link instead which would be the same as for wiki links in a single page export to html.
Fixing Code¶
The code below will considers these link formats:
def render_page_hierarchy(pages, node=nil, options={})
content = +''
if pages[node]
content << "<ul class=\"pages-hierarchy\">\n"
pages[node].each do |page|
content << "<li>"
href = if controller.request.format.pdf?
# absolute link for pdf export of single page or all pages in a single document
options[:target] = '_blank'
options[:rel] = 'noopener'
project_wiki_page_url(project_id: page.project, id: page.title, version: nil)
elsif controller.params[:format] == 'html' && controller.action_name == 'export'
# relative link for html export of all pages in a single document
"##{page.title}"
elsif controller.params[:format] == 'html'
# absolute for html export of single page
"#{h(page.pretty_title)}.html"
else
# link handling for rendering pages in UI
{:controller => 'wiki', :action => 'show',
:project_id => page.project, :id => page.title, :version => nil}
end
content <<
link_to(
h(page.pretty_title),
href,
:target => options[:target],
:rel => options[:rel],
:title => (if options[:timestamp] && page.updated_on
l(:label_updated_time, distance_of_time_in_words(Time.now, page.updated_on))
else
nil
end)
)
content << "\n" + render_page_hierarchy(pages, page.id, options) if pages[page.id]
content << "</li>\n"
end
content << "</ul>\n"
end
content.html_safe
end
The patch file contains also some test changes and additional tests.
I guess older version than 5.1.3 are also affected.
A related issue is: Feature #22001: PDF export wiki internal link.
I would appreciate to discuss my proposal and see a fix coming soon!
Files
Updated by Liane Hampe 5 months ago
When reproducing the issue import the txt
files for a wiki example first. After confirming the behavior you can try the patch with these wiki pages to see the difference.