如何在 Blog 中使用语法高亮显示

by Richard 6. March 2010 11:11

大家写博客时,常常需要贴出代码,但显示在blog页面上的效果往往很难让人满意(不能语法高亮),习惯了在开发工具中看语法高亮代码的我们肯定也想在blog上看到同样的效果。那如何实现一个代码高亮效果呢?经常上一些技术大牛的博客,发现很多都是用的SyntaxHighlighter语法高亮工具,于是推荐给阿东,由于它不需要与服务器交互,所以安装这个扩展很简单,只需要包含相应css文件,js文件,就可以轻松实现代码高亮。很快,阿东便在APJ的博客上安装了SyntaxHighlighter扩展。

使用SyntaxHighlighter高亮显示代码也非常简单,下面就以实例介绍如何使用syntaxhighlighter语法高亮工具优化你的代码显示,让你和那些大牛一样能在博客上写出"漂亮"的代码。更详细的使用说明可以访问SyntaxHighlighter的网站

首先来看一段javascript代码使用高亮后的效果: 

    /**
     * demo function
     */
    function foo()
    {
        alert('Hello World!');
        // it works!
    }

效果还不错吧。我们来看看是怎么做到的:

第一步,打开一个notepad,在里面贴入要显示的语句,例如上面例子中的:

    /**
     * demo function
     */
    function foo()
    {
        alert('Hello World!');
        // it works!
    }

注:如果你的代码中有“<”(小于号),还要把全部的“<”都替换为“&lt;”,后文会解释原因。

第二步,用一个<pre></pre>把代码包裹起来,并通过pre元素的class来指定要展示的是什么语言。就像:

<pre class="brush: js">

......

</pre>

 注:为了节省篇幅,我们用......代表要显示的代码块。

第三步,从notepad中拷贝上面所有的代码,并粘贴到你想要显示的blog的位置,注意这里要在blog编辑器的HTML模式下进行粘贴。在APJ的博客上可以有两种方式切换到HTML模式:

 方法1是点击“HTML”按钮:

方法2是选中“User raw HTML editor”单选框:

 

现在再来具体解释一下其中的细节:

第一步中,为什么要把“<”替换成“&lt;”呢?上面的步骤中也提到我们最后的代码块加上pre的包装是以HTML的方式放入文章中的,在HTML中“<”代表一个标签的开始,后面的内容就不会正常解释了,要想在HTML中正常显示一个“<”,要用它的转义符“&lt;”。其实大家平时想在网页中多显示几个空格时,就会用到空格的转义符“&nbsp;”,其实是同一个意思。 其实SyntaxHighlighter支持两种方式高亮显示,一个是用我们正在介绍的pre标签来显示,还有一个是用script标签来显示。用script标签可以解决转义的问题,可以免去替换“<”的步骤,它的实现方法是把代码放在“<![CDATA[”和“]]>”中间(点击了解更多)。但是不幸的是我们APJ的博客的编辑器不支持输入“<![CDATA[”和“]]>”,所以只能使用pre的方式,杯具啊!而且我试过,我们用pre的方式,只需要替换“<”,不需要替换“>”,我发现“>”是被自动替换成“&gt;”。那为什么我们不需要替换空格,接着看下面。

第二步中,为什么要用pre标签来显示代码呢?如果直接把代码块放在HTML中,其中的一些空格,回车换行,以及缩进都会被忽略掉,而pre标签元素(preformatted text)是专门用来展现预定义格式(包括空格,回车换行,以及缩进)的标签。

在<pre>标签中可以通过不同的配置,为各种语言做高亮显示,目前SyntaxHighlighter支持二十多中语言高亮显示,我们用的比较多的是: 

语言

配置值(注意全都是小写)

C#

c#, c-sharp, csharp

VB.net/ VB Script

vb

C/ C++

c, cpp

CSS

css

Javascript

js

Java

java

PHP

php

Plain Text

plain, text

SQL

sql

XML/ HTML

xml, xhtml, xslt, html, xhtml

下面再多看几个例子:

SQL ,写法:<pre class="brush: sql">......</pre>

delete from [cqaInterfaceFilter]

insert into [cqaInterfaceFilter]([QualCode] ,[SystemCode])
select [QualCode],'' from cqaQualCode where Substring(Upper(QualCode),1,1) in ('R','S')

HTML:<pre class="brush: html">......</pre>

注:第二行自动换行了,因为一行摆不下,但是行号还是对的。

<?xml  version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Hello, world!</title>
  </head>
  <body>
    <p>Hello, world!</p>
  </body>
</html>

C#:<pre class="brush: c#; highlight: [4, 18]">......</pre>

注:第18行自动换行了

注:如果想要特别突显某行,如下面的第4行和第18行,配置也很简单,就是在pre的class中写上 highlight: [4, 18]

using System;
using System.Web;

namespace Test
{
    /// <summary>
    /// Test class for highlight in blog
    /// </summary>
    public partial class WebForm1 : System.Web.UI.Page
    {
        /// <summary>
        /// Page load event
        /// </summary>
        /// <param name="sender">The sender</param>
        /// <param name="e">The event parameter</param>
        protected void Page_Load(object sender, EventArgs e)
        {
            HttpContext.Current.Response.Write("Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World ");
            HttpContext.Current.Response.End();
        }
    }
}

VB.net:<pre class="brush: vb">......</pre>

Imports System
Imports System.Web

Namespace Test
	''' <summary>
	''' Test class for highlight in blog
	''' </summary>
	Public Partial Class WebForm1
		Inherits System.Web.UI.Page
		''' <summary>
		''' Page load event
		''' </summary>
		''' <param name="sender">The sender</param>
		''' <param name="e">The event parameter</param>
		Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
			HttpContext.Current.Response.Write("Hello World")
			HttpContext.Current.Response.End()
		End Sub
	End Class
End Namespace

CSS:<pre class="brush: css">......</pre>

.syntaxhighlighter {
	width: 99% !important; /* 99% fixes IE8 horizontal scrollbar */
	margin: 1em 0 1em 0 !important;
	padding: 1px !important; /* adds a little border on top and bottom */
	position: relative !important;
}

Java:<pre class="brush: java">......</pre>

/** 
 * The HelloWorldApp class implements an application that
 * simply prints "Hello World!" to standard output.
 */
class HelloWorldApp {
    public static void main(String[] args) {
        System.out.println("Hello World!"); // Display the string.
    }
}

介绍一个小技巧,当你想要拷贝某段代码时,直接从页面上copy,会把行号一起拷贝,如果想只拷贝原始代码,可以把鼠标移到代码块上,代码块的右上角会出现一个工具栏,其中第一个按钮“view source”会弹出一个只包含原始代码块的窗口,再Ctrl+A,Ctrl+C。或者直接点击第二个“copy to clipboard”按钮就拷贝到了剪贴板,不过第二个按钮是用Flash做的,你的机器必须有安装Flash Player才能使用。不过我相信只要有上网,大家都应该装了Flash Player,所以“copy to clipboard”按钮是最方便的拷贝代码方式。

SyntaxHighlighter还可以改变Theme,甚至定制Theme,让代码显示更符合用户自己的需要,看看它提供的另外一个深色背景的Theme吧:

这个黑色背景的看上去也不错,眼睛看着不累,也节能环保。不过Theme不是每个blog用户可以自己改的,这是由admin来管理,一旦修改便会改变所有用户代码显示的样式。如果大多数人都喜欢某个Theme才好叫管理员修改配置。

就介绍这么多,如果想知道更多,可以去访问它的网站。有了这么好的条件,还希望大家多多写博,多来秀秀你的代码。

Tags: ,

General | 使用技巧

dotNet 代码检查标准v1.0 发布

by Richard 28. October 2009 12:59

昨天下午的Common Library的讨论,主要是再次评审代码检查的标准。 现在把评审通过的代码检查标准v1.0 的文件发布出来。

APJ Code Review Checklist v1.0.xls (49.00 kb)

大家可以依照这个check list中的内容检查一下,看看自己开发的代码是否符合标准,有不符合的要配合项目组想办法改进。

如果大家对这个代码检查的标准有什么问题和意见,可以在此留言,或直接给我反馈。

Tags:

Common Library | Standard

关于Common Library的一些想法

by Richard 20. October 2009 23:39

目的:

建立和维护一个公司级的可复用公共库,主要为了3个目的:

  1. 提高开发效率,让开发人员从系统级功能的开发中解放出来,把工作重点放在业务级功能的开发。
  2. 提高代码质量,开发人员写的代码越少了,问题就越少。
  3. 改善不同团队,不同项目之间代码风格的一致性,促进团队之间的交流与合作。

 

内容:

主要包含这几种类型:组件、控件、函数库、工具、示例,以及从项目中抽象出的可复用模块。

其实可以考虑把公司的开发规范,代码检查标准也纳入Common Library中一起管理。

 

开发:

当识别出有新的可复用的item,Common Library管理小组要进行讨论,确定基本方案;然后指定负责人,按照要求完成开发,并对验收检查后才能入库。

  

测试:

Common Library中的每一项都是要经过严格的测试后才能发布出来的,测试用例和测试报告都要保留存档,方便检查和以后参考。

可以借助一些单元测试工具,使得测试用例可复用,并自动执行大部分测试,提高测试效率。

 

文档:

主要包含4个文档:

  1. 功能文档:实现了那些功能和特性(feature),还有哪些没有完成的功能(to do list),还有哪些bug没有修复(bug list),版本历史记录(history)。
  2. 使用手册:什么情况可以使用(when to use),从哪里获取最新版本(where to use),如何使用(how to use),和一些注意事项(tip)。
  3. 设计文档:包括Class Diagram,Class Reference,Database ER Diagram。
  4. 测试文档:主要包含测试用例和测试报告。

   
维护:   

配置管理方面也应该分开两个代码库:开发库和产品库。 开发库只有参与Common Library开发的人员可以访问,而产品库是公开只读权限给所有人。只有测试通过的代码,而且相应的文档也同时更新了,经过管理组的同意才能更新到产品库。更新产品库后要发布消息给大家,并告知更新的内容。
要建立一个查询系统,让大家可以方便的查找想要的内容。
定期检查,了解使用情况,收集新需求:在Code Review Checklist中加入对Common Library使用的检查,在项目总结中加入对Common Library使用情况的总结、改进意见、以及推荐项目中可被纳入Common Library的新内容。

 

风险:

执行前需要一个深远的考虑和计划。否则不易执行或不能长久坚持下去。
如果Common Library有更新或发布了新版本,要考虑是否对已经在运行的系统有影响,再决定各个系统是否应用更新。

 

职责:

从上面看下来,要把Common Library建设好,需要做很多的工作。公司应该有专门的人员来做这个工作,建立起相关的组织来管理和维护它。

公司越大,Common Library的意义就越重要,同时也越难管理。如果公司真的要扩大3倍,安排一两个人专门做这个应该不过分。       
   

 

其实Common Library的关键不是建立一个代码库,而是需要相应的管理流程和公司气氛才能使Common Library变得有生命力和发挥更大的效力。

Tags:

Common Library

Common Library 进展

by Richard 17. September 2009 12:32

昨天的Common Library讨论中,主要还是说了权限控制的实现细节,

  • 设置权限的方法放在 override OnPreRender 中,不利于分清楚事件前后的关系,建议放在 override OnPreRenderCompleted,或注册事件的方式。
  • 在control级的控制,现在是使用简单的case判断,给控件的属性赋值,建议使用反射,提高可扩展性。
  • 在control级的控制,当两个角色对某个控件的控制权限矛盾时,如何确定优先级。第一阶段先按照简单的方式做:肯定优先的并集。
  • 对Page和Function级别,要提供一个维护页面的例子。
  • 找控件时,现在使用的是递归的方式,建议改用asp.net 2.0中的新特性,$连接符。


另外,还讨论了大家比较关心的基础数据维护的例子,

  • 确定了三种操作方式

         1,弹出div,做新增,查看,修改。
         2,对于字段比较少的,在Grid中实现新增,修改。
         3,多条数据同时编辑,最后批量更新。

  • 数据访问方式,使用Towngas Team的Lamda表达式解析的方式。
  • 和数据库操作完了后,把相应的用户消息处理放到统一的事件处理程序中做。
  • 排序的 Sort Expression 使用 viewstate 保持。
  • 使用Common Lib中的分页控件。


每次讨论,大家都会提出很多需求和新的想法, 虽然有一些是由于时间有限和技术问题无法在短期内实现。但我觉得这些 new idea 都是很有价值的,所以决定把他们都记录下来,经常的review一下,在合适的时机把它们一一搞定。 也方便后面写文档和测试用。 看附件

Common Lib 备忘录.xls (26.50 kb)


还要提醒一下,后面即将开始的MTR新项目会要求使用我们的新Common Lib,新项目的同事请注意以下附件中的开发进度,如果你们觉得哪些内容是你们要求比较紧迫的,可以告诉我,我们可以适当调整开发进度,尽量满足你们项目的需求。

Common Lib Schedule.xls (23.50 kb)

Tags:

Common Library

Common Library 菜单控件

by Richard 27. July 2009 22:51

经过前面两次的Common Library讨论会,基本确定了菜单控件的需求和实现方式,记录下来以便后续的讨论和测试。

  1. 使用微软提供的 ASP.NET Menu + SiteMapDataSource 来实现。
  2. 要同时支持XML和数据库存放菜单数据,为数据库存放方式提供一个自定义的Provider,可以在这两种方式间很方便的切换。
  3. 支持菜单内容多语言显示。
  4. 要同时支持横向显示和纵向显示,并可以很方便的切换。
  5. 跨浏览器支持,要支持IE(v6和以上版本), FireFox, Chrome, Opear, Safari。
  6. 使用符合web HTML 语义标准的 ul + li 标签,而不是微软Menu控件的默认 table + td 标签。
  7. 当前页对应的菜单项能高亮显示。
  8. 将菜单项集合缓存起来以提高性能,并提供强行更新缓存的方法。
  9. 尽量少使用图片和图标,减少网络传输的负担。

欢迎大家在此留言,发表大家对Common Library的菜单控件的不同意见和要求,谢谢!

 

 

listry 同事说得有道理,把第9点改一下:

9. 支持在没给Menu Item前显示不同的图标, 也可以配置为不显示以适应网络带宽不是很好的环境。

Tags:

Common Library

Copyright © 2009 APJ Software

最新评论

Comment RSS

公告

欢迎使用APJ Blog!

日历

<<  February 2012  >>
MoTuWeThFrSaSu
303112345
6789101112
13141516171819
20212223242526
2728291234
567891011

View posts in large calendar