九天雁翎的博客
如果你想在软件业获得成功,就使用你知道的最强大的语言,用它解决你知道的最难的问题,并且等待竞争对手的经理做出自甘平庸的选择。 -- Paul Graham

从剪贴板到剪贴板的通用语法高亮软件发布(支持N多语言)

 

write by 九天雁翎(JTianLing) -- www.jtianling.com

讨论新闻组及文件

 需求来源

    不太喜欢太限制于Windows下的Windows live
writer(以下简称WLW),虽然很多人认为它是博客写作工具的number
one,甚至看到有外国的朋友曾经高呼,Linux下唯一缺少替代品的软件就是WLW了,经过长久的使用,本身功能并不算太强大,但是开放的插件系统,让
其强大到无以复加,我在以前《windows
live
writer
试用及众多插件试用评测...



文中有很详细的描述,过程中也解决过很多WLW本身的问题,比如没有模板的问题,(通过autohotkey解决),比如说本地保存目录不能改变的问题,
(通过junction来改变)比如在公司及家中文档不能同步的问题,(通过dropbox),但是越依赖WLW,我就感觉越不舒服,因为我在Linux
下越来越感觉没有好用的博客写作工具了,而且WLW专有的格式,使得我无法太好的使用已有的文档,这些都是无法忽视的大问题,于是,最终,我决定彻底的迁
移到Google Document上来,无论是普通的文档,还是Blog的写作。

    首先有个先天性的问题,Google
Document是没有开发插件系统的,这样,碰到问题我们都没有办法通过扩展来解决,特别突出的问题就是代码高亮问题,对于程序员的博客。。。。。。贴
代码实在是太经常的事情了,不能解决此问题也是我以前甚至愿意用Word2007来写博客都不用Google
Document。既然今天决定了使用Google
Document,那么找个办法来解决此问题吧,方法目前想到一个,HTML的直接插入,(还好Google
Document支持),那么我只需要将代码在剪贴板中保存为高亮的HTML,然后直接嵌入Google Document就行了,So
Easy................解决此问题吧,于是就有了我的新工程“code-highlight-clipboard2clipboard
”,因为自己写语法分析及高亮的代码实在太麻烦了,只好选择站在巨人的肩膀上:)我利用GVim来解决此问题。(目前使用时需要自己先安装Gvim,并且将其目录加进PATH中,即在任何目录下都能通过gvim命令调用到gvim)

 

先看看效果

 

此文在Google Document下完成,以下是主体源代码的实际转换效果。还算是比较漂亮吧:)

 


 1
from
 optparse import
 OptionParser
 2
from
 distutils.file_util import
 *
 3
import
 os
 4
import
 tempfile
 5

 6
def

 main
():
 7
    
 8
    usage = 'usage: %prog [options]
'
 9
    version = '''%prog 0.1 Created By JTianLing

10
Any Question could be sent to JTianLing{at}Gmail.com,

11
and any advice or any bug report is appreciated too.
'''
12
    
13
    parser = OptionParser(usage, version = version)
14
    parser.add_option('-f
', '--filename
', metavar = 'FILE
', dest = 'filename
',
15
                      help = 'Write output to FILE and save it.
')
16
    parser.add_option('-t
', '--syntax
', action = 'store
',
17
                      type = 'string
', dest = 'syntax
',
18
                      default = '',
19
                      help = 'Set the code syntax type
')
20
    parser.add_option('-c
', '--color
', action = 'store
',
21
                      type = 'string
', dest = 'color
',
22
                      default = 'default
',
23
                      help = 'Set the code highlight color template
')
24
    parser.add_option('-n
', action= 'store_true
', dest = 'isNumber
',
25
                      default = False,
26
                      help = 'Is output with line number.
')
27
    (options, args) = parser.parse_args()
28
    
29
    filename = tempfile.mktemp() + '.tmp
'
30
        
31
    cboutStr = 'cbout >
' + filename
32
    os.system(cboutStr)
33
    
34
    syn = options.syntax
35
    color = options.color
36
    
37
    # ugly but useful vim's format code

38
    vimCmd = 'gvim -c ":syntax on|:color
' + color + '|:set syn=
' + syn/

39
     + '|:set nu
' + ('' if

 options.isNumber else

 '!
') + '|TOhtml" -c ":w|:qa"
' + filename
40
    os.system(vimCmd)
41
    #print(vimCmd)

42
    
43
    newFilename = filename + '.html
'
44
    cbinStr = 'more
' + newFilename + ' | cbin
'
45
    os.system(cbinStr)          
46

47
    # Del the temp file when that's needed

48
    if

 options.filename:
49
        move_file(newFilename, './
' + options.filename)
50
    else

:
51
        os.remove(newFilename)
52
        
53
    os.remove(filename)
54
    
55
if

 __name__ == '__main__
':
56
    main()

 

 

使用

 

除了以上的源代码,我还实现了两个类似于stdin及stdout的与剪贴板相关的cbin,cbout命令(clipboard in or out)。实际使用方法类似stdin及stdout,分别是写入剪贴版中及从剪贴板中读出数据,(只支持文本格式)

其实下一版预计还可以抽出整个转换的过程,那样使用起来可能更加灵活。目前此代码仅在Windows下测试,但是为了兼容,我使用了PyQt的库(所以狂大,其实才几行代码),将来会在Linux下测试及发布Linux的

二进制版本。

 

使用方法是在Google Document中通过(Edit->Edit Html->粘贴->Update),你也可以保存为任何你想要的文件/粘贴到你想要去的任何位置。

命令的使用方法如下:

 

>chc2c --help
Usage: chc2c [options]

Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -f FILE, --filename=FILE
                        Write output to FILE and save it.
  -t SYNTAX, --syntax=SYNTAX
                        Set the code syntax type
  -c COLOR, --color=COLOR
                        Set the code highlight color template
  -n                    Is output with line number.

 

支持的语言

 

支持的语言种类/语法格式几乎囊括了常见的所有语言,(仅限制于Vim支持的种类,站在巨人的肩膀上就是好),以下是一个列表:

 


2html          a2ps
a65            aap            abap           abaqus
abc            abel           acedb          ada
aflex          ahdl           alsaconf       amiga
aml            ampl           ant            antlr
apache         apachestyle    arch           art
asm            asm68k         asmh8300       asn
aspperl        aspvbs         asterisk       asteriskvm
atlas          autohotkey     autoit         automake
ave            awk            ayacc          b
baan           basic          bc             bdf
bib            bindzone       blank          bst
btm            bzr            c              calendar
catalog        cdl            cdrdaoconf     cdrtoc
cf             cfg            ch             change
changelog      chaskell       cheetah        chill
chordpro       cl             clean          clipper
cmake          cmusrc         cobol          coco
colortest      conaryrecipe   conf           config
context        cpp            crm            crontab
cs             csc            csh            csp
css            cterm          ctrlh          cuda
cupl           cuplsim        cvs            cvsrc
cweb           cynlib         cynpp          d
dcd            dcl            debchangelog   debcontrol
debsources     def            denyhosts      desc
desktop        dictconf       dictdconf      diff
dircolors      diva           django         dns
docbk          docbksgml      docbkxml       dosbatch
dosini         dot            doxygen        dracula
dsl            dtd            dtml           dtrace
dylan          dylanintr      dylanlid       ecd
edif           eiffel         elf            elinks
elmfilt        erlang         eruby          esmtprc
esqlc          esterel        eterm          eviews
exim           expect         exports        fasm
fdcc           fetchmail      fgl            flexwiki
focexec        form           forth          fortran
foxpro         framescript    freebasic      fstab
fvwm           fvwm2m4        gdb            gdmo
gedcom         git            gitcommit      gitconfig
gitrebase      gitsendemail   gkrellmrc      gnuplot
gp             gpg            grads          gretl
groff          groovy         group          grub
gsp            gtkrc          haml           hamster
haskell        haste          hastepreproc   hb
help           hercules       hex            hitest
hog            hostconf       html           htmlcheetah
htmldjango     htmlm4         htmlos         ia64
ibasic         icemenu        icon           idl
idlang         indent         inform         initex
initng         inittab        ipfilter       ishd
iss            ist            jal            jam
jargon         java           javacc         javascript
jess           jgraph         jproperties    jsp
kconfig        kix            kscript        kwt
lace           latte          ld             ldapconf
ldif           lex            lftp           lhaskell
libao          lifelines      lilo           limits
lisp           lite           litestep       loginaccess
logindefs      logtalk        lotos          lout
lpc            lprolog        lscript        lsl
lss            lua            lynx           m4
mail           mailaliases    mailcap        make
man            manconf        manual         maple
masm           mason          master         matlab
maxima         mel            messages       mf
mgl            mgp            mib            mma
mmix           mmp            modconf        model
modsim3        modula2        modula3        monk
moo            mp             mplayerconf    mrxvtrc
msidl          msmessages     msql           mupad
mush           muttrc         mysql          named
nanorc         nasm           nastran        natural
ncf            netrc          netrw          nosyntax
nqc            nroff          nsis           objc
objcpp         ocaml          occam          omnimark
openroad       opl            ora            pamconf
papp           pascal         passwd         pcap
pccts          pdf            perl           pf
pfmain         php            phtml          pic
pike           pilrc          pine           pinfo
plaintex       plm            plp            plsql
po             pod            postscr        pov
povini         ppd            ppwiz          prescribe
privoxy        procmail       progress       prolog
promela        protocols      psf            ptcap
purifylog      pyrex          python         qf
quake          r              racc           radiance
ratpoison      rc             rcs            rcslog
readline       README.txt         rebol          registry
remind         resolv         reva           rexx
rhelp          rib            rnc            rnoweb
robots         rpcgen         rpl            rst
rtf            ruby           samba          sas
sass           sather         scheme         scilab
screen         sd             sdl            sed
sendpr         sensors        services       setserial
sgml           sgmldecl       sgmllnx        sh
sicad          sieve          simula         sinda
sindacmp       sindaout       sisu           skill
sl             slang          slice          slpconf
slpreg         slpspi         slrnrc         slrnsc
sm             smarty         smcl           smil
smith          sml            snnsnet        snnspat
snnsres        snobol4        spec           specman
spice          splint         spup           spyce
sql            sqlanywhere    sqlforms       sqlinformix
sqlj           sqloracle      sqr            squid
sshconfig      sshdconfig     st             stata
stp            strace         sudoers        svn
syncolor       synload        syntax         sysctl
tads           tags           tak            takcmp
takout         tar            tasm           tcl
tcsh           terminfo       tex            texinfo
texmf          tf             tidy           tilde
tli            tpp            trasys         trustees
tsalt          tsscl          tssgm          tssop
uc             udevconf       udevperm       udevrules
uil            updatedb       valgrind       vb
vera           verilog        verilogams     vgrindefs
vhdl           vim            viminfo        virata
vmasm          voscm          vrml           vsejcl
wdiff          web            webmacro       wget
whitespace     winbatch       wml            wsh
wsml           wvdial         xbl            xdefaults
xf86conf       xhtml          xinetd         xkb
xmath          xml            xmodmap        xpm
xpm2           xquery         xs             xsd
xslt           xxd            yacc           yaml
z8a            zsh            

 

 

是不是比目前存在的所有语法高亮工具支持的语言种类还要多?你要是说你懂的上面没有的语言,我一定认为你是神仙。。。。。。。。。。。。

 

好了,别的不多说了,自己下载试用吧,目前还是0.1版,以后会慢慢增加一些功能的,最主要的是找到一个精简版的vim(目前需要首先自己安装Vim才能使用,并将Vim的目录加入PATH中才能使用)

 

 

完整源代码获取说明

工程保管在Google上:http://code.google.com/p/code-highlight-clipboard2clipboard/

也可以直接使用Mercurial克隆下库:

https://code-highlight-clipboard2clipboard.googlecode.com/hg/

Mercurial使用方法见《分布式的,新一代版本控制系统Mercurial的介绍及简要入门

 

原创文章作者保留版权 转载请注明原作者 并给出链接

write by 九天雁翎(JTianLing) -- www.jtianling.com

 

分类:  我的程序 
标签: 

Posted By 九天雁翎 at 九天雁翎的博客 on 2010年01月06日

前一篇: 迅雷官方手把手教你,一个下载软件中到底可以强行植入多少广告 后一篇: 可商业使用的免费软件推荐列表(revision 2 )