Initial commit.
author |
Chris Eldredge <chris.eldredge@gmail.com> |
date |
Thu, 09 Aug 2012 18:05:09 -0400 |
parents |
(none) |
children |
a1ca051886bd |
'''
Markdown Extension for hgweb
============================
Similar to GitHub, this module looks for a file named ReadMe.md or
ReadMe.markdown (case insensitive) in the "default" revision.
A custom theme is provided that displays the formatted contents on the summary (index) view.
Configuration:
* Clone this repository to /example/hgext.markdown
* Add the following to your hgweb config:
[web]
templates = /example/hgext.markdown
style = markdown
[extensions]
hgext.markdown=/example/hgext.markdown
Usage with TortoiseHg
If you want to use this extension with TortoiseHg, you will need to
obtain the python markdown package (http://packages.python.org/Markdown/)
and uncomment the section below that adjusts the python module path.
'''
import os
import sys
import markdown
from mercurial.hgweb import webcommands, webutil, common
from mercurial import extensions, encoding, util
import logging
logging.basicConfig()
def filerevision_markdown(web, req, tmpl):
f = req.form.get('file', [''])[0]
parts = os.path.splitext(f)
if not parts[1] == '.markdown' and not parts[1] == '.md':
return rawfile(web, req, tmpl)
previewMode = 'node' in req.form and req.form['node'][0] == '_preview'
if previewMode:
text = file(web.repo.root + "/" + f).read()
else:
fctx = webutil.filectx(web.repo, req)
text = fctx.data()
if util.binary(text):
# todo: handle preview mode
return rawfile(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}
if previewMode:
args.update({'rev':'PREVIEW', 'node':'PREVIEW'})
else:
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):
readmefile = find_working_copy_readme(web.repo)
changeid = 'default' # todo: add hgrc config setting
previewMode = False
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
ext = os.path.splitext(readmefile)[1]
if text:
base_url = tmpl.defaults['url'] + 'markdown/' + changeid + "/"
md = markdown.Markdown(
extensions=['urlrebase', 'wikilinks'],
extension_configs={
'urlrebase' : [('base_url', base_url)],
'wikilinks' : [('base_url', base_url), ('end_url', ext)]})
readme = md.convert(text)
tmpl.defaults['readmefilename'] = readmefile
tmpl.defaults['readme'] = readme
return orig(web, req, tmpl)
def find_working_copy_readme(repo):
for filename in os.listdir(repo.root):
if filename.lower() == 'readme.md' or filename.lower() == 'readme.markdown':
return filename
def extsetup():
extensions.wrapfunction(webcommands, 'summary', summary_markdown)
webcommands.markdown = filerevision_markdown
webcommands.__all__.append('markdown')