--- a/__init__.py Mon Aug 13 18:33:19 2012 +0100
+++ b/__init__.py Mon Aug 13 18:43:07 2012 +0100
@@ -1,159 +1,159 @@
-import os
-import sys
-
-# If using TortoiseHg, obtain Python-Markdown and tell Python where to find it:
-#sys.path.append("c:/python27/Lib/site-packages/markdown-2.2.0-py2.7.egg")
-
-import logging, markdown, mimetypes
-from mercurial import extensions, encoding, util
-from mercurial.hgweb import webcommands, webutil, common
-from mercurial.hgweb.common import ErrorResponse, HTTP_OK, HTTP_FORBIDDEN, HTTP_NOT_FOUND
-import mdx_urlrebase
-
-logging.basicConfig()
-
-def preview_markdown(web, req, tmpl):
- f = req.form.get('node', [''])[0]
- path = req.form.get('file', [''])[0]
- if path:
- f = f + '/' + path
-
- if not f:
- f = find_working_copy_readme(web.repo.root)
-
- parts = os.path.splitext(f)
-
- try:
- text = file(web.repo.root + "/" + f, "rb").read()
- except IOError:
- raise ErrorResponse(HTTP_NOT_FOUND, 'path not found: ' + f)
-
- if not parts[1] == '.markdown' and not parts[1] == '.md':
- return preview_sendraw(web, req, f, text)
-
- md = markdown.Markdown(extensions=['wikilinks(base_url={0},end_url={1})'.format('', parts[1])])
- html = md.convert(text)
-
- args = {'file':f,
- 'readmefilename':parts[0].split('/')[-1],
- 'path':webutil.up(f),
- 'readme':html,
- 'rev':'PREVIEW',
- 'node':'PREVIEW'}
-
- return tmpl("markdown", **args)
-
-def preview_sendraw(web, req, path, data):
- guessmime = web.configbool('web', 'guessmime', False)
-
- if util.binary(data):
- mt = 'application/binary'
- else:
- mt = 'text/plain'
-
- if guessmime:
- mt = mimetypes.guess_type(path)[0]
- if mt is None:
- mt = binary(text) and 'application/binary' or 'text/plain'
- if mt.startswith('text/'):
- mt += '; charset="%s"' % encoding.encoding
-
- req.respond(HTTP_OK, mt, path, len(data))
- return [data]
-
-def file_markdown(orig, web, req, tmpl):
- f = req.form.get('file', [''])[0]
- parts = os.path.splitext(f)
-
- try:
- fctx = webutil.filectx(web.repo, req)
- text = fctx.data()
- except LookupError, inst:
- try:
- return webcommands.manifest(web, req, tmpl)
- except ErrorResponse:
- raise inst
-
- if util.binary(text):
- return webcommands.rawfile(web, req, tmpl)
-
- if not parts[1] == '.markdown' and not parts[1] == '.md':
- return orig(web, req, tmpl)
-
- md = markdown.Markdown(extensions=['wikilinks(base_url={0},end_url={1})'.format('', parts[1])])
- html = md.convert(text)
-
- args = {'file':f,
- 'readmefilename':parts[0].split('/')[-1],
- 'path':webutil.up(f),
- 'readme':html}
-
- args.update({'rev':fctx.rev(),
- 'node':fctx.hex(),
- 'author':fctx.user(),
- 'date':fctx.date(),
- 'desc':fctx.description(),
- 'branch':webutil.nodebranchnodefault(fctx),
- 'parent':webutil.parents(fctx),
- 'child':webutil.children(fctx)})
-
- return tmpl("markdown", **args)
-
-def summary_markdown(orig, web, req, tmpl):
- """
- Decorates the default summary view by adding 'readme' and 'readmefile' content
- to the template.
- """
-
- changeid = web.config('web', 'markdown.changeid', 'tip')
- previewMode = False
- text = None
-
- cctx = web.repo[changeid]
- changeid = cctx.hex()[0:12]
- for filename in cctx:
- if filename.lower() == 'readme.md' or filename.lower() == 'readme.markdown':
- fctx = cctx.filectx(filename)
- text = fctx.data()
- readmefile = filename
- break
-
- if text:
- ext = os.path.splitext(readmefile)[1]
- base_url = tmpl.defaults['url'] + 'file/' + changeid + "/"
- base_raw_url = tmpl.defaults['url'] + 'rawfile/' + changeid + "/"
-
- def rebase(proc, e, attr):
- uri = e.get(attr, '')
- if '://' in uri or uri.startswith('/'):
- return
- base = base_url
- if attr == 'src':
- base = base_raw_url
- e.set(attr, proc.rebase(base, uri))
-
- ext = mdx_urlrebase.UrlRebaseExtension(configs=[('rebase', rebase)])
- md = markdown.Markdown(
- extensions=[ext, 'wikilinks'],
- extension_configs={
- 'wikilinks' : [('base_url', base_url), ('end_url', ext)]})
- readme = md.convert(text)
- else:
- readmefile = "ReadMe"
- readme = "Add ReadMe.md or ReadMe.markdown to this repository to display it here."
-
- tmpl.defaults['readmefilename'] = readmefile
- tmpl.defaults['readme'] = readme
-
- return orig(web, req, tmpl)
-
-def find_working_copy_readme(dir):
- for filename in os.listdir(dir):
- if filename.lower() == 'readme.md' or filename.lower() == 'readme.markdown':
- return filename
-
-def extsetup():
- extensions.wrapfunction(webcommands, 'file', file_markdown)
- extensions.wrapfunction(webcommands, 'summary', summary_markdown)
- webcommands.preview = preview_markdown
- webcommands.__all__.append('preview')
+import os
+import sys
+
+# If using TortoiseHg, obtain Python-Markdown and tell Python where to find it:
+#sys.path.append("c:/python27/Lib/site-packages/markdown-2.2.0-py2.7.egg")
+
+import logging, markdown, mimetypes
+from mercurial import extensions, encoding, util
+from mercurial.hgweb import webcommands, webutil, common
+from mercurial.hgweb.common import ErrorResponse, HTTP_OK, HTTP_FORBIDDEN, HTTP_NOT_FOUND
+import mdx_urlrebase
+
+logging.basicConfig()
+
+def preview_markdown(web, req, tmpl):
+ f = req.form.get('node', [''])[0]
+ path = req.form.get('file', [''])[0]
+ if path:
+ f = f + '/' + path
+
+ if not f:
+ f = find_working_copy_readme(web.repo.root)
+
+ parts = os.path.splitext(f)
+
+ try:
+ text = file(web.repo.root + "/" + f, "rb").read()
+ except IOError:
+ raise ErrorResponse(HTTP_NOT_FOUND, 'path not found: ' + f)
+
+ if not parts[1] == '.markdown' and not parts[1] == '.md':
+ return preview_sendraw(web, req, f, text)
+
+ md = markdown.Markdown(extensions=['wikilinks(base_url={0},end_url={1})'.format('', parts[1])])
+ html = md.convert(text)
+
+ args = {'file':f,
+ 'readmefilename':parts[0].split('/')[-1],
+ 'path':webutil.up(f),
+ 'readme':html,
+ 'rev':'PREVIEW',
+ 'node':'PREVIEW'}
+
+ return tmpl("markdown", **args)
+
+def preview_sendraw(web, req, path, data):
+ guessmime = web.configbool('web', 'guessmime', False)
+
+ if util.binary(data):
+ mt = 'application/binary'
+ else:
+ mt = 'text/plain'
+
+ if guessmime:
+ mt = mimetypes.guess_type(path)[0]
+ if mt is None:
+ mt = binary(text) and 'application/binary' or 'text/plain'
+ if mt.startswith('text/'):
+ mt += '; charset="%s"' % encoding.encoding
+
+ req.respond(HTTP_OK, mt, path, len(data))
+ return [data]
+
+def file_markdown(orig, web, req, tmpl):
+ f = req.form.get('file', [''])[0]
+ parts = os.path.splitext(f)
+
+ try:
+ fctx = webutil.filectx(web.repo, req)
+ text = fctx.data()
+ except LookupError, inst:
+ try:
+ return webcommands.manifest(web, req, tmpl)
+ except ErrorResponse:
+ raise inst
+
+ if util.binary(text):
+ return webcommands.rawfile(web, req, tmpl)
+
+ if not parts[1] == '.markdown' and not parts[1] == '.md':
+ return orig(web, req, tmpl)
+
+ md = markdown.Markdown(extensions=['wikilinks(base_url={0},end_url={1})'.format('', parts[1])])
+ html = md.convert(text)
+
+ args = {'file':f,
+ 'readmefilename':parts[0].split('/')[-1],
+ 'path':webutil.up(f),
+ 'readme':html}
+
+ args.update({'rev':fctx.rev(),
+ 'node':fctx.hex(),
+ 'author':fctx.user(),
+ 'date':fctx.date(),
+ 'desc':fctx.description(),
+ 'branch':webutil.nodebranchnodefault(fctx),
+ 'parent':webutil.parents(fctx),
+ 'child':webutil.children(fctx)})
+
+ return tmpl("markdown", **args)
+
+def summary_markdown(orig, web, req, tmpl):
+ """
+ Decorates the default summary view by adding 'readme' and 'readmefile' content
+ to the template.
+ """
+
+ changeid = web.config('web', 'markdown.changeid', 'tip')
+ previewMode = False
+ text = None
+
+ cctx = web.repo[changeid]
+ changeid = cctx.hex()[0:12]
+ for filename in cctx:
+ if filename.lower() == 'readme.md' or filename.lower() == 'readme.markdown':
+ fctx = cctx.filectx(filename)
+ text = fctx.data()
+ readmefile = filename
+ break
+
+ if text:
+ ext = os.path.splitext(readmefile)[1]
+ base_url = tmpl.defaults['url'] + 'file/' + changeid + "/"
+ base_raw_url = tmpl.defaults['url'] + 'rawfile/' + changeid + "/"
+
+ def rebase(proc, e, attr):
+ uri = e.get(attr, '')
+ if '://' in uri or uri.startswith('/'):
+ return
+ base = base_url
+ if attr == 'src':
+ base = base_raw_url
+ e.set(attr, proc.rebase(base, uri))
+
+ ext = mdx_urlrebase.UrlRebaseExtension(configs=[('rebase', rebase)])
+ md = markdown.Markdown(
+ extensions=[ext, 'wikilinks'],
+ extension_configs={
+ 'wikilinks' : [('base_url', base_url), ('end_url', ext)]})
+ readme = md.convert(text)
+ else:
+ readmefile = "ReadMe"
+ readme = "Add ReadMe.md or ReadMe.markdown to this repository to display it here."
+
+ tmpl.defaults['readmefilename'] = readmefile
+ tmpl.defaults['readme'] = readme
+
+ return orig(web, req, tmpl)
+
+def find_working_copy_readme(dir):
+ for filename in os.listdir(dir):
+ if filename.lower() == 'readme.md' or filename.lower() == 'readme.markdown':
+ return filename
+
+def extsetup():
+ extensions.wrapfunction(webcommands, 'file', file_markdown)
+ extensions.wrapfunction(webcommands, 'summary', summary_markdown)
+ webcommands.preview = preview_markdown
+ webcommands.__all__.append('preview')