Merge pull request #148 from d0ugal/image-fix

Fix image paths in non-index markdown files
This commit is contained in:
Dougal Matthews
2014-10-10 10:12:27 +01:00
4 changed files with 47 additions and 9 deletions

View File

@@ -11,18 +11,21 @@ import json
class PathToURL(object):
def __init__(self, nav=None):
def __init__(self, template, nav=None):
self.template = template
self.nav = nav
def __call__(self, match):
url = match.groups()[0]
scheme, netloc, path, query, query, fragment = urlparse(url)
if (scheme or netloc or not utils.is_markdown_file(path)):
if scheme or netloc:
# Ignore URLs unless they are a relative link to a markdown file.
return 'a href="%s"' % url
return self.template % url
if self.nav:
if self.nav and not utils.is_markdown_file(path):
path = utils.create_media_urls(self.nav, [path])[0]
elif self.nav:
# If the site navigation has been provided, then validate
# the internal hyperlink, making sure the target actually exists.
target_file = self.nav.file_context.make_absolute(path)
@@ -40,7 +43,7 @@ class PathToURL(object):
# Convert the .md hyperlink to a relative hyperlink to the HTML page.
url = urlunparse((scheme, netloc, path, query, query, fragment))
return 'a href="%s"' % url
return self.template % url
def convert_markdown(markdown_source, extensions=()):
@@ -73,8 +76,15 @@ def convert_markdown(markdown_source, extensions=()):
def post_process_html(html_content, nav=None):
html_content = re.sub(r'a href="([^"]*)"', PathToURL(nav), html_content)
html_content = re.sub('<pre>', '<pre class="prettyprint well">', html_content)
anchor_sub = PathToURL('a href="%s"', nav)
html_content = re.sub(r'a href="([^"]*)"', anchor_sub, html_content)
img_sub = PathToURL('src="%s"', nav)
html_content = re.sub(r'src="([^"]*)"', img_sub, html_content)
html_content = html_content.replace('<pre>', '<pre class="prettyprint well">')
return html_content

View File

@@ -14,6 +14,9 @@ if PY2:
import SocketServer
socketserver = SocketServer
import itertools
zip = itertools.izip
text_type = unicode
binary_type = str
string_types = (str, unicode)
@@ -28,6 +31,8 @@ else: # PY3
import socketserver
socketserver = socketserver
zip = zip
text_type = str
binary_type = bytes
string_types = (str,)

View File

@@ -98,7 +98,10 @@ class URLContext(object):
# Workaround for static assets
return '.'
return url.lstrip('/')
return posixpath.relpath(url, start=self.base_path) + suffix
relative_path = posixpath.relpath(url, start=self.base_path) + suffix
# Under Python 2.6, relative_path adds an extra '/' at the end.
return relative_path.rstrip('/')
class FileContext(object):

View File

@@ -3,7 +3,7 @@
from mkdocs import build, nav, toc, utils, config
from mkdocs.compat import PY2
from mkdocs.compat import PY2, zip
import markdown
import os
import shutil
@@ -431,6 +431,26 @@ class BuildTests(unittest.TestCase):
html = build.post_process_html(html)
self.assertEqual(html.strip(), expected.strip())
def test_convert_internal_media(self):
pages = [
('index.md',),
('internal.md',),
('sub/internal.md')
]
site_navigation = nav.SiteNavigation(pages)
expected_results = (
'<p><img alt="The initial MkDocs layout" src="./img/initial-layout.png" /></p>',
'<p><img alt="The initial MkDocs layout" src="../img/initial-layout.png" /></p>',
'<p><img alt="The initial MkDocs layout" src="../../img/initial-layout.png" /></p>',
)
for (page, expected) in zip(site_navigation.walk_pages(), expected_results):
html = '<p><img alt="The initial MkDocs layout" src="img/initial-layout.png" /></p>'
html = build.post_process_html(html, site_navigation)
self.assertEqual(html, expected)
def test_ignore_external_link(self):
md_text = 'An [external link](http://example.com/external.md).'
expected = '<p>An <a href="http://example.com/external.md">external link</a>.</p>'