[PATCH] highlight: Only pygmentize for HTML mimetypes

Rocco Rutte pdmef at gmx.net
Wed Sep 3 15:46:17 CDT 2008


Hi,

* Dirkjan Ochtman wrote:

> Could you add some testing for this to test-highlight? That would be great.

Sure, here we go (testing simply vs. hg cat/annotate). Compared to the 
first one it has two minor adjustments which I think are better:

- test against "text/html", not just for "html"
- use stringify() to render template to string

Regards, Rocco

# HG changeset patch
# User Rocco Rutte <pdmef at gmx.net>
# Date 1220474450 -7200
# Node ID bde0256f0395bc8cabe215130213b0914651c9b5
# Parent  6c4a08270222569ba906f4f1c7860783eec19225
highlight: Only pygmentize for HTML mimetypes

For non-html mimetypes it doesn't make much sense. This also fixes the
issue that highlight unconditionally adds a <link/> tag for its CSS to
the template's header (which is pointless in text/plain output).

diff --git a/hgext/highlight/__init__.py b/hgext/highlight/__init__.py
--- a/hgext/highlight/__init__.py
+++ b/hgext/highlight/__init__.py
@@ -20,19 +20,24 @@ The default is 'colorful'.
 
 import highlight
 from mercurial.hgweb import webcommands, webutil, common
+from mercurial.templater import stringify
 
 web_filerevision = webcommands._filerevision
 web_annotate = webcommands.annotate
 
 def filerevision_highlight(web, tmpl, fctx):
-    style = web.config('web', 'pygments_style', 'colorful')
-    highlight.pygmentize('fileline', fctx, style, tmpl)
+    mt = stringify(tmpl('mimetype', encoding=web.encoding))
+    if mt.startswith('text/html'):
+        style = web.config('web', 'pygments_style', 'colorful')
+        highlight.pygmentize('fileline', fctx, style, tmpl)
     return web_filerevision(web, tmpl, fctx)
 
 def annotate_highlight(web, req, tmpl):
-    fctx = webutil.filectx(web.repo, req)
-    style = web.config('web', 'pygments_style', 'colorful')
-    highlight.pygmentize('annotateline', fctx, style, tmpl)
+    mt = stringify(tmpl('mimetype', encoding=web.encoding))
+    if mt.startswith('text/html'):
+        fctx = webutil.filectx(web.repo, req)
+        style = web.config('web', 'pygments_style', 'colorful')
+        highlight.pygmentize('annotateline', fctx, style, tmpl)
     return web_annotate(web, req, tmpl)
 
 def generate_css(web, req, tmpl):
diff --git a/hgext/highlight/highlight.py b/hgext/highlight/highlight.py
--- a/hgext/highlight/highlight.py
+++ b/hgext/highlight/highlight.py
@@ -8,6 +8,7 @@ demandimport.ignore.extend(['pkgutil', '
 
 from mercurial import util
 from mercurial.templatefilters import filters
+from mercurial.templater import stringify
 
 from pygments import highlight
 from pygments.util import ClassNotFound
@@ -20,7 +21,7 @@ def pygmentize(field, fctx, style, tmpl)
 def pygmentize(field, fctx, style, tmpl):
 
     # append a <link ...> to the syntax highlighting css
-    old_header = ''.join(tmpl('header'))
+    old_header = stringify(tmpl('header'))
     if SYNTAX_CSS not in old_header:
         new_header =  old_header + SYNTAX_CSS
         tmpl.cache['header'] = new_header
diff --git a/tests/test-highlight b/tests/test-highlight
--- a/tests/test-highlight
+++ b/tests/test-highlight
@@ -18,14 +18,47 @@ hg serve -p $HGPORT -d -n test --pid-fil
 hg serve -p $HGPORT -d -n test --pid-file=hg.pid -A access.log -E errors.log
 cat hg.pid >> $DAEMON_PIDS
 
-echo % hgweb filerevision
+echo % hgweb filerevision, html
 ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/file/tip/get-with-headers.py') \
     | sed "s/[0-9]* years ago/long ago/g"
 
-echo % hgweb fileannotate
+echo % hgweb fileannotate, html
 ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/annotate/tip/get-with-headers.py') \
     | sed "s/[0-9]* years ago/long ago/g"
 
+echo % hgweb fileannotate, raw
+("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/annotate/tip/get-with-headers.py?style=raw') \
+    | sed "s/^test at 0:/0:/" > a
+
+echo "200 Script output follows" > b
+echo "" >> b
+echo "" >> b
+hg annotate "get-with-headers.py" >> b
+echo "" >> b
+echo "" >> b
+echo "" >> b
+echo "" >> b
+
+S1=`"$TESTDIR/md5sum.py" a | sed 's/a$//'`
+S2=`"$TESTDIR/md5sum.py" b | sed 's/b$//'`
+
+test "$S1" = "$S2" && echo "annotate ok" || echo "annotate fail"
+
+echo
+echo % hgweb filerevision, raw
+("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/file/tip/get-with-headers.py?style=raw') \
+    > a
+
+echo "200 Script output follows" > b
+echo "" >> b
+hg cat get-with-headers.py >> b
+
+S1=`"$TESTDIR/md5sum.py" a | sed 's/a$//'`
+S2=`"$TESTDIR/md5sum.py" b | sed 's/b$//'`
+
+test "$S1" = "$S2" && echo "cat ok" || echo "cat fail"
+
+echo
 echo % hgweb highlightcss friendly
 "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/highlightcss' > out
 head -n 4 out
diff --git a/tests/test-highlight.out b/tests/test-highlight.out
--- a/tests/test-highlight.out
+++ b/tests/test-highlight.out
@@ -1,6 +1,6 @@ adding get-with-headers.py
 adding get-with-headers.py
 % hg serve
-% hgweb filerevision
+% hgweb filerevision, html
 200 Script output follows
 
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
@@ -63,7 +63,7 @@ 200 Script output follows
 </body>
 </html>
 
-% hgweb fileannotate
+% hgweb fileannotate, html
 200 Script output follows
 
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
@@ -130,6 +130,12 @@ 200 Script output follows
 </body>
 </html>
 
+% hgweb fileannotate, raw
+annotate ok
+
+% hgweb filerevision, raw
+cat ok
+
 % hgweb highlightcss friendly
 200 Script output follows
 


More information about the Mercurial-devel mailing list