__init__.py @ 299ff954bfa8

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')