让google wave支持语法高亮

deepgully posted on 2009-11-13 19:07 last update: 2009-11-13 19:13


Back

Usage

    0. 获取wave邀请并登陆wave. (我还剩下几个邀请名额,需要的请发邮件)
    1. 添加 wavehighlight@appspot.com 到wave联系人列表.
    2. 将 wavehighlight机器人加到你想要高亮的wave中.
    3. 按下面的格式输入代码段:
	    [code lang='lang' style='style']
	    code here...
	    [/code]
    4. Done. waveHighlight 会自动把 [code]...[/code] 所包含的代码高亮显示.

Back

示例

 在wave中输入并提交:   
[code lang='python' style='default']
    def OnBlipSubmitted(properties, context):
        """Invoked everytime a blip is submitted"""
        blip = context.GetBlipById(properties['blipId']).GetDocument()
        highlightBlip(blip)
    [/code ] #删掉code之后的空格
    

Back

支持的语言和样式


Back

Styles:

manni,   perldoc,   borland,   colorful,   default,   murphy,   vs,   trac,   tango,   fruity,   autumn,   bw,   emacs,   pastie,   friendly,   native,  


Back

languages:

apacheconf,   applescript,   as,   as3,   basemake,   bash,   bat,   bbcode,   befunge,   boo,   brainfuck,   c,   c-objdump,   cheetah,   clojure,   common-lisp,   control,   cpp,   cpp-objdump,   csharp,   css,   css+django,   css+erb,   css+genshitext,   css+mako,   css+myghty,   css+php,   css+smarty,   d,   d-objdump,   delphi,   diff,   django,   dpatch,   dylan,   erb,   erlang,   fortran,   gas,   genshi,   genshitext,   gnuplot,   groff,   haskell,   html,   html+cheetah,   html+django,   html+genshi,   html+mako,   html+myghty,   html+php,   html+smarty,   ini,   io,   irc,   java,   js,   js+cheetah,   js+django,   js+erb,   js+genshitext,   js+mako,   js+myghty,   js+php,   js+smarty,   jsp,   lhs,   lighty,   llvm,   logtalk,   lua,   make,   mako,   matlab,   matlabsession,   minid,   moocode,   mupad,   myghty,   mysql,   nasm,   nginx,   numpy,   objdump,   objective-c,   ocaml,   perl,   php,   pot,   pov,   py3tb,   pycon,   pytb,   python,   python3,   raw,   rb,   rbcon,   redcode,   rhtml,   rst,   scala,   scheme,   smalltalk,   smarty,   sourceslist,   splus,   sql,   sqlite3,   squidconf,   tcl,   tcsh,   tex,   text,   trac-wiki,   vb.net,   vim,   xml,   xml+cheetah,   xml+django,   xml+erb,   xml+mako,   xml+myghty,   xml+php,   xml+smarty,   xslt,   yaml,  

 

Posted in Google  •  Comments(0)»

云南映象(大理,香格里拉)

deepgully posted on 2009-11-05 09:16 last update: 2009-11-09 10:24

从梅里回来,在大理修整了几天,骑单车环游洱海


Back

大理

环海的美利达勇士,还算争气,没有爆胎.

环海的美利达勇士

洱海上关附近,水面长满水葫芦.

洱海上关附近

洱海上的渔民.

洱海上的渔民

下关的滨海大道边

下关的滨海大道边


Back

香格里拉

白马雪山,去的时候在垭口遇到一个骑单车去西藏的,下坡速度惊人,我们的面包车追了10多分钟才追上.

白马雪山

金沙江大拐弯,我们去的时候正在修围墙,现在去估计要门票了.

金沙江大拐弯

纳帕海秋色,也是被围墙围起来的,30块~.这是我绕到围墙边偷拍的.

纳帕海秋色

去德钦路上的大沟,照片上看不出气势,我坐车从照相的地方到谷底的幸福村花了1个小时.

幸福村

更多照片猛击 http://gullygallery.appspot.com

Posted in Misc  •  Comments(0)»

云南映象(梅里雪山,雨崩)

deepgully posted on 2009-11-05 09:16 last update: 2009-11-09 10:23

上个月去了一趟云南, 在雨崩天天遇到下雨,终于在走的那天看到了向往已久的卡瓦格博,还算不虚此行.

梅里主峰,卡瓦格博

梅里主峰,卡瓦格博

雪山脚下的雨崩村

雪山脚下的雨崩村

神瀑秋色

神瀑秋色

雨中冰湖

雨中冰湖

更多照片请移步 http://gullygallery.appspot.com

 

 

Posted in Misc  •  Comments(0)»

eclipse3.5 不能启动和 java heap overflow 问题

deepgully posted on 2009-11-05 09:16 last update: 2009-11-05 09:16

最近下载了eclipse3.5, 解压后不能启动,网上搜索也找不到结果. 最后发现是eclipse.ini的配置问题, 将配置改成如下,可以正常启动了.

 

- startup
plugins/org.eclipse.equinox.launcher_1.0.200.v20090520.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.0.200.v20090519
-product
org.eclipse.epp.package.cpp.product

 

可是装上pydev和WTP(web tools platform)后老是出现假死和java heap overflow的问题, 在eclipse.ini中加入以下几行,问题解决.

 

-vmargs
-Xms512m
-Xmx1024m
-XX:+UseParallelGC

 

Posted in Misc  •  Comments(0)»

[原创]GAE/Micolog实现语法高亮

deepgully posted on 2009-11-05 09:15 last update: 2009-11-05 09:15


Back

前言

本文主要讲基于Pygments实现Micolog文章中代码段的语法高亮 . Pygments 是一个用python编写的语法高亮package. 由于是使用纯python的package,所以可以用于基于GAE的程序.


Back

概要设计

文章内容中的代码段使用[ code lang='...' style='...']...[/code ]来标记,在显示文章的时候使用正则表达式找出需要高亮的代码段,然后用pyments的HtmlFormatter来生成高亮的html代码和css文件,最后替换文章中的相应内容.


Back

详细实现


Back

0. 准备工作

由于Micolog自带的tinymce编辑器会在保存文章的时候清除掉空格,导致代码缩进都没有了,所以需要下载一个最新版的tinymce替换掉原本的编辑器. 首先去http://tinymce.moxiecode.com/下载最新版的tinymce并打包成tinymce.zip文件,替换掉micolog根目录下的tinymce.zip(zip文件内的目录结构要保持一致). 然后把micolog的views/admin/entry.html文件中的tinymce初始化代码全部删掉,并在{% block header %}中插入新的tinymce初始化代码:

{% block header %}
<!-- TinyMCE -->
<script type="text/javascript" src="/tinymce/tiny_mce.js"></script>
<script type="text/javascript">
    tinyMCE.init({
        // General options
        mode : "exact",    <!-- 只替换指定的目标 -->
        elements: "content",  <!-- 替换idcontenttextareatinymce的编辑器 -->
        theme : "advanced",
        language : "en",
        plugins : "safari,pagebreak,save,advhr,advimage,advlink,emotions, inlinepopups,media,directionality,visualchars,nonbreaking",

        // Theme options
        theme_advanced_buttons1 : "save,newdocument,|,forecolor,backcolor, formatselect,fontselect,fontsizeselect,bold,italic,underline,strikethrough,| ,justifyleft,justifycenter,justifyright,justifyfull",
        theme_advanced_buttons2 : "bullist,numlist,|,outdent,indent,blockquote,|, undo,redo,|,link,unlink,anchor,image,cleanup,help,code",
        theme_advanced_buttons3 : "hr,removeformat,visualaid,|,sub,sup,|,charmap,emotions,iespell, media,advhr,|,ltr,rtl,|,highlight,|,visualchars,nonbreaking,pagebreak",

        theme_advanced_toolbar_location : "top",
        theme_advanced_toolbar_align : "left",
        theme_advanced_statusbar_location : "bottom",
        theme_advanced_resizing : true,

        // Example content CSS (should be your site CSS)
        content_css : "/static/styles/wordpress.css",

        // Drop lists for link/image/media/template dialogs
        template_external_list_url : "lists/template_list.js",
        external_link_list_url : "lists/link_list.js",
        external_image_list_url : "lists/image_list.js",
        media_external_list_url : "lists/media_list.js",
    });
</script>
<!-- /TinyMCE -->
{% endblock %}
 


Back

1. 下载pygments并打包成zip文件

GAE规定文件数目不能超过1000个,但是提供了读取zip包的方法,添加如下代码来import zip包中的pyments文件.

import os,sys
DIR_PATH = os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
PYGMENTS_PATH = os.path.join(DIR_PATH,'pygments.zip')  

sys.path.insert(0,PYGMENTS_PATH) #将zip包的路径加入path

#下面就可以正常import了
from pygments import highlight
from pygments.lexers import get_lexer_by_name,guess_lexer,get_all_lexers,find_lexer_class
from pygments.formatters import HtmlFormatter
from pygments.styles import get_all_styles  


Back

2. 实现高亮函数

import re
re_source = re.compile(r"\[code lang='(?P<lang>\S+)'\s*(style='(?P<style>\S+)'){0,1}\](?P<source>.+?)\[/code\]",re.DOTALL)  #匹配代码段的正则表达式

#高亮代码显示style,主要是自动换行
divstyles = 'word-wrap:break-word;white-space: pre;border:1px solid #BBBBBB;font-size: 9pt;\
line-height:125%;margin:10px 0 10px 0;' 
prestyles = "white-space:pre-wrap;white-space: -moz-pre-wrap;white-space: \
-pre-wrap;white-space: -o-pre-wrap;word-wrap: break-word;\
padding:0.99em;"

#高亮函数,传入micolog的entry
def makeHighlight(entry):
    matches = list(re_source.finditer(entry.content))
    index = 0
    for match in matches:
        try: 
            all = match.group(0)
            lang = match.group('lang') or 'text'
            style = match.group('style') or 'default'
            source = match.group('source')
            #由于tinymce保存的是html代码,所以需要转换成原始格式
            source = source.replace('<p>','').replace('</p>','\n').replace('&nbsp;',' ').\
                         replace('<br>','\n').replace('<br />','\n').replace('<br/>','\n').\
                         replace('<p/>','\n').\
                         replace('&lt;','<').replace('&gt;','>').replace('&amp;','&')
            try:
                lexer = get_lexer_by_name(lang)  
            except:
                try:
                    lexer = guess_lexer(source)
                except:
                    lexer = get_lexer_by_name('text')
            
            formatatter = HtmlFormatter(style=style,
                            cssclass=style,
                            cssstyles = divstyles,
                            prestyles = prestyles,
                            noclasses = False,
                            lineanchors = 'code%d'%index,
                            lineseparator = '\n'
                            )
            newsource = highlight(source,lexer, formatatter)
            entry.content = entry.content.replace(all, newsource)
            index += 1
        except:
            pass 


Back

3. 在模板中插入css文件链接

<link rel="stylesheet" href="/static/styles/highlight.css" type="text/css" media="screen" />  


Back

4. 在view函数中调用makeHighlight

 class MainPage(BasePublicPage):
    #......
    @cache()
    def doget(self,page):
        page=int(page)

        entries = Entry.all().filter('entrytype =','post').\
                filter("published =", True).order('-date')
                #fetch(self.blog.posts_per_page, offset = page * self.blog.posts_per_page)
        
        entries,links=CCPager(query=entries,items_per_page = self.blog.posts_per_page).fetch(page)

        for entry in entries:
            makeHighlight(entry)

        return self.render('index',{'entries':entries,
                        'pager':links,
                        'pageindex':page,
                        'ishome':True,
                            })  


Back

更多内容

添加tinymce插件方便插入代码段,待续...

 

 

Posted in Python Web/Django/GAE  •  Comments(7)»

当前第1页,共4页